【问题标题】:Using PHP's $_SERVER['HTTP_REFERER'] Without Recognizing Parameters在不识别参数的情况下使用 PHP 的 $_SERVER['HTTP_REFERER']
【发布时间】:2014-05-14 13:51:28
【问题描述】:

我使用 if 语句和 PHP 的 $_SERVER['HTTP_REFERER'] 来检查用户是否来自主页并执行一些功能:

if($_SERVER['HTTP_REFERER'] == htttp://www.example.com {
//some code
}

问题是主页有时会在 URL 中传递 GET 变量,而 PHP 的 $_SERVER['HTTP_REFERER'] 方法将带有 GET 变量的 URL 视为不同的 URL,因此不会触发 if 函数,除非用户来自主页没有传递 GET 变量。

无论是否传递了 GET 变量,我都想在有人来自主页时触发 if 语句,任何帮助将不胜感激!

【问题讨论】:

  • 旁注:使用$_SERVER['HTTP_REFERER'] 并不总是可靠的。
  • 已经涵盖[在什么情况下 HTTP_REFERER 为空][1] [1]:stackoverflow.com/questions/6880659/…
  • @Fred-ii- 是对的,像往常一样。此外,它也并不总是安全的,see why
  • 虚构攻击可能性:mixedbit.org/referer.html
  • @JackWilliams 我并不总是做对,但我会尝试 ;-)

标签: php get http-referer


【解决方案1】:

最简单的方法是检查HTTP_REFERER 是否以你想要的URL开头:

if (strpos($_SERVER['HTTP_REFERER'], 'http://www.example.com') === 0)) {

【讨论】:

    【解决方案2】:

    你也可以试试这个

    $url = $_SERVER['HTTP_REFERER'];
    $data = parse_url($url);
    $referer= $data['host'];
    
    if($referer== 'www.example.com') {
        // Some codes here
    }
    
    /*
    var_dump($data);
    Array
    (
        [scheme] => http
        [host] => www.example.com
        [path] => /path/to/
        [query] => here=there
    )
    */
    

    有了这个,你甚至可以提取引用者的路径和查询字符串。

    注意:如果您的方案可以是httphttps,最好只提取主机名www.example.com 进行匹配。

    【讨论】:

      【解决方案3】:

      @EmilyShepherd 的回答应该有效。

      不过,这只会检查域。这是有利的,因为某些站点允许省略 (www.),而其他站点甚至可以通过 (https://) 和 (http://) 访问。

      if (strpos($_SERVER['HTTP_REFERER'], 'example.com')) {/*If refer contains example.com*/}
      

      顺便说一句,请注意,引用很容易被欺骗。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2015-09-06
        • 2016-07-14
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        相关资源
        最近更新 更多