【问题标题】:The ultimate HTTP_REFERER solution for PHP back button?PHP 后退按钮的终极 HTTP_REFERER 解决方案?
【发布时间】:2011-05-06 17:45:37
【问题描述】:

是的,我知道,另一个 HTTP_REFERER 努力。当我看到它时,我畏缩。但它已作为“返回”问题的解决方案交给我,它确实有效,所以......

...问题是,我对它的理解还不够,无法在现场部署它。

我在这里阅读了很多关于 HTTP_REFERER 危险的消息,但是我被告知这段代码针对这个特定任务解决了这些问题......但我不相信。

所以,我的问题在下面代码的底部 - 但首先,这是它背后的基础:

此代码进入购物车。它在用户单击“查看购物车”后提供“继续购物”按钮的操作。它的目标是提供最合适的(或预期的)重定向到用户来自的地方。

默认情况下,如果不添加此代码,此特定“查看购物车”页面的“继续购物”按钮只会将用户带到购物车的主页 - 如果用户已经浏览了几页深度,这有点打击查找一组产品或特定类别,或者正在查看产品等。所以我们希望对此进行改进。此外,购物车需要 javascript 才能完成购买,如果用户在关闭 JS 的情况下访问,则会警告用户,因此在此操作期间用户需要打开 JS。最后,我们希望将解决方案保留在单个代码块中,以便可以轻松应用并传输到购物车的更新版本而几乎没有问题。

向我描述的方法:

  1. 如果设置了推荐人并且它不为空并且是的它确实包含此购物车的域,那么

    1a。如果引用者是购物车页面本身,请应用 javascript (-1) 效果,否则我们会卡在一个地方

    1b。 ELSE 继续申请Referer - 完成。

  2. ELSE 如果设置了推荐并且它不为空但不包含此购物车的域然后

    2a。有问题,发到主页。 (??为什么??)

    2b。 ELSE 让我们应用 javascript (-1) 效果。 - 完成。

代码:

if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']) && (strpos($_SERVER['HTTP_REFERER'], HTTP_SERVER) === 0))) {
    if ($_SERVER['HTTP_REFERER'] == HTTP_SERVER . 'index.php?r=cart') {
        $this->data['continue'] = 'javascript:history.go(-1)';
    }
    else {
        $this->data['continue'] = html_entity_decode($_SERVER['HTTP_REFERER']);
    }
}
else {
    if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']) && (strpos($_SERVER['HTTP_REFERER'], HTTP_SERVER) !== 0))) {
        $this->data['continue'] = 'index.php?r=home';
    }
    else {
        $this->data['continue'] = 'javascript:history.go(-1)';
    }
}

我的问题:

  1. 好的,所以我们已经结合了两种可疑的方法,总的来说它似乎有效。但是这个(安全/功能)会出现什么问题?这里有我想念的表演者吗?

  2. 第二部分(2. 和 2a.)要完成什么?我解释说这是为了确定是否有人故意尝试提供虚假推荐人-但这对我来说没有意义-为什么我们关心将该人路由到主页而不是使用 javascript ( -1) 方法?

  3. 有任何改进的想法吗?那些总是派上用场;-)

感谢您抽出宝贵时间帮助解决此问题...

【问题讨论】:

  • referer由客户提供,不可靠。您可能会更幸运地将查看的最后一页存储在会话变量中。
  • 您好,谢谢...这是这篇文章的重点...应该在代码中解决了这个问题,方法是检查引用者 (1) 是否存在, (2)不为空,(3)包含购物车的域名,然后默认使用javascript方法……也符合我们自包含的要求。我知道有更好的解决方案涉及会话变量等,但在这种情况下,我试图专门关注这个 http_referer 版本,看看它在这个应用程序中是否可行......
  • 永远不要依赖 JavaScript 作为后备!
  • @Nev - 感谢您的回复...是因为它可能不可用吗?还是有其他原因?我最初考虑在“查看购物车”模板中添加一个 noscript 标记,当没有 JS 时显示一个链接以将用户带到主页(无论如何这是该链接的默认操作) - 但由于购物车的大部分内容都需要 javascript关键功能,关闭 JS 的用户已经看到带有访问我们静态目录的链接的消息,因此他们不太可能在这种情况下尝试浏览在线购物车。
  • 是的,没有 JS 的人很少,但那些费尽心思关掉它(或安装 NoScript)的人通常会更恼火!

标签: php javascript back-button http-referer strpos


【解决方案1】:

Referer 只是用户在进入购物车之前访问的最后一页。

  1. Javascript:history.go() 包含一个类似于referer 的访问页面数组,因此它可以将用户返回历史页面。除非购物车没有超时,否则我不知道这是什么风险。但是我不是一个安全人员,所以最好让有更多知识的人解释那里的风险。

  2. 如果用户从其他网站直接跳转到那里的购物车,那么确实应该有什么问题,而不是将它们留在那里,将它们发送到主页。在这种情况下,java 是一个客户端软件,因此它不会有浏览您网站的历史记录来将用户发送到您的主页。

  3. 如果你真的不喜欢referer,面包屑总是另一种选择,或者$_SESSION['previousPage'] = ....

如果我错了,请纠正我。

【讨论】:

  • 非常感谢您的回复...哈哈哈“如果您真的不喜欢推荐人”...嘿,我想喜欢它! ;-) ...主要是从安全角度来看我不信任它,这是我最大的担忧。主页问题的重点......我想如果它可以检测到用户来自外部站点,直接进入“购物车视图”,那么将它们发送到主页至少会将它们保留在商店中,而不是将它们发送回原始站点。当然,如果没有推荐人,那么 javascript 默认会将它们发送回来......但似乎不太可能访问......?交易
  • 不太可能,但并非不可能。尤其是当您有人试图破解您的购物车时;)
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多