我有一个PHP脚本来检查HTTP Referer。
if ($_SERVER['HTTP_REFERER'] == 'http://www.example.com/') {...}
然而,这似乎是不安全的...因为如果用户转到'http://example.com/'
或'http://www.ExaMple.com'
会发生什么(两者都与相等测试不匹配)。
问题:什么是更好的相等测试,以确保HTTP Referer来自'example.com'
?
答案 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'])) { ... }