PHP:检查$ _SERVER ['HTTP_REFERER']的相等性的最佳方法是什么?

时间:2010-04-05 19:39:18

标签: php security

我有一个PHP脚本来检查HTTP Referer。

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

然而,这似乎是不安全的...因为如果用户转到'http://example.com/''http://www.ExaMple.com'会发生什么(两者都与相等测试不匹配)。

问题:什么是更好的相等测试,以确保HTTP Referer来自'example.com'

5 个答案:

答案 0 :(得分:3)

parse_url()加上一些字符串杂耍应该做你想要的。试试这个:

$url = parse_url($_SERVER['HTTP_REFERER']);
//take the last two 'dot segments' of the host
$hostOnly = implode('.',array_slice(explode('.',$url['host']),-2));
if (strtolower($hostOnly) == 'example.com') {
    //stuff
}

请注意,对于格式错误的URL,parse_url()可能会失败,因此您可能希望添加一些错误检查以确保安全。 HTTP_REFERER很容易被垃圾填满。

答案 1 :(得分:1)

强制性回复:HTTP_REFERER可能会被欺骗,因此无法100%确定是否有人来自特定网站。

但是,如果您确实想依赖它,可以使用正则表达式在HTTP_REFERER中查找“example.com”。 stristr()也可以使用,可能会被推荐,因为它会比正则表达式更快。它也不区分大小写,因此它匹配“ExaMple.com”以及“example.com”。

答案 2 :(得分:1)

希望你不要检查它是否有重要意义。

您可以使用parse_url()函数获取主机名部分,并检查HTTP_REFERER是否实际包含网址。
你也可以只是下载www。来自主机名。
字符大小写并不重要,因为它始终是小写的

或使用正则表达式。

答案 3 :(得分:0)

if (strtolower($_SERVER['HTTP_REFERER']) == 'http://www.example.com/') {...}

怎么样......

$parts = explode('/',$_SERVER['HTTP_REFERER']);
if (in_array('example.com',$parts) || in_array('www.example.com',$parts)) {...}

答案 4 :(得分:0)

使用正则表达式,这将成为

if(preg_match("%(http://)?(www\.)?example\.com(/)?%i",$_SERVER['HTTP_REFERER'])) { ... }