PHP返回按钮的最终HTTP_REFERER解决方案?

时间:2011-05-06 17:45:37

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

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

......问题是,我不太清楚它是否适合在现场进行部署。

我在这里经历了很多关于HTTP_REFERER危险的消息,不过我被告知这段代码可以解决这个特殊任务...但我不相信。

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

此代码进入购物车。用户点击“查看购物车”后,它会提供“继续购物”按钮的操作。其目标是将最合适(或预期)的重定向提供回用户来自的位置。

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

我所描述的方法论:

  1. 如果设置了引用并且它不是空的,是的,那么它包含这个购物车的域,那么

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

    1b中。 ELSE继续并应用Referer - Done。

  2. ELSE如果设置了引用并且它不是空的但是它不包含此购物车的域

    2a上。有些不对劲,请将它们发送到主页。 (??为什么??)

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

  3. 代码:

    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. 有关改进的任何想法?那些总是派上用场; - )

    4. 感谢您抽出宝贵时间......

1 个答案:

答案 0 :(得分:1)

Referer只是用户访问购物车前访问过的最后一页。

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

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

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

  4. 如果我错了,请纠正我。