所以,我需要使用php检查引用者到页面,如果是* .example.com或* .anothersite.com,则执行代码,但如果没有,则重定向到其他地方。
我如何检查HTTP_REFERER是否等于具有通配符的那些值?
谢谢!
编辑:网址将包含多个域名,因此正则表达式需要匹配找到的第一个域名。
答案 0 :(得分:17)
应该这样做:
$allowed_host = 'example.com';
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if(substr($host, 0 - strlen($allowed_host)) == $allowed_host) {
// some code
} else {
// redirection
}
答案 1 :(得分:6)
$ref = $_SERVER['HTTP_REFERER'];
if (strpos($ref, 'example.com') !== FALSE) {
redirect to wherever example.com people should go
}
if (strpos($ref, 'example.org') !== FALSE) {
redirect to wherever example.org people should go
}
当然,这只适用于引用者“很好”的情况。例如,来自谷歌你可能在某个地方的搜索词中有“example.org”,在这种情况下strpos会看到它,并重定向,即使你来自谷歌。
答案 2 :(得分:3)
其他答案'检查'很好但不严格限制在您的网站上。因此,例如值为http://attacker.com/www.example.com/
的引用将通过几乎所有检查。制作此类网站非常容易,只需发送跨域请求即可。
有一种可靠而安全的方法可以检查引用是否 真正 您的域名。当然引用者可能是欺骗者,但攻击者网站的受害者会发送正确的引用者。
诀窍是^
特殊字符。这是神奇的正则表达式:
^https?://(([a-z0-9-]+)\.)*example\.com/
^
- 确保我们处于起步阶段
https?
- 协议 - http或https
(([a-z0-9-]+)\.)*
- 匹配子域名,也可以是更高级别的子域名(如果有的话)
example\.com
- 匹配主域名
/
- 确保路径启动,以便域名无法继续
答案 3 :(得分:1)
试试这个:
if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER']))
{
// execute your code
}
else
{
header("Location: http://example.com/redirectpage.htm");
exit();
}
答案 4 :(得分:1)
preg_match('/(.+?)\.example\.(com|org)/',$_SERVER['HTTP_REFERER'])
这只会匹配具有子域名的地址,并且也不会继续查找subdomain.example.com
或.org
之外的任何内容。即subdomain.example.com/some-other-stuff
。你还需要匹配其中任何一个吗?
更正 - 这将与www.example.com
匹配,但与example.com
不匹配。