所以,我需要检查引用到使用php的页面,如果它是* .example.com或* .anothersite.com,执行代码,但如果不是,重定向到其他地方。检查PHP引用链接
我该如何去检查HTTP_REFERER是否等于那些具有通配符的值?
谢谢!
编辑:该网址将包含多个域,所以正则表达式需要匹配找到的第一个发生。
所以,我需要检查引用到使用php的页面,如果它是* .example.com或* .anothersite.com,执行代码,但如果不是,重定向到其他地方。检查PHP引用链接
我该如何去检查HTTP_REFERER是否等于那些具有通配符的值?
谢谢!
编辑:该网址将包含多个域,所以正则表达式需要匹配找到的第一个发生。
$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会看到它,并重定向,即使你来自谷歌。
这原来是我所需要的。我过于复杂的事情。谢谢! – JakeSteam 2011-02-17 18:39:48
如果允许的主机是`iana.org`而引用者是`www.iana.org.nyud.net`,该怎么办?**(实际域)** – seriousdev 2011-02-17 18:55:45
试试这个:
if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER']))
{
// execute your code
}
else
{
header("Location: http://example.com/redirectpage.htm");
exit();
}
preg_match('/(.+?)\.example\.(com|org)/',$_SERVER['HTTP_REFERER'])
这将只匹配了子域的地址,也不会继续寻求超越subdomain.example.com
或.org
什么。即subdomain.example.com/some-other-stuff
。你是否也需要匹配其中之一?
更正 - 这将匹配www.example.com
,但不会匹配example.com
。
应该这样做:
$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
}
其他答案检查是好的,但并不严格绑定到你的网站。因此,例如价值http://attacker.com/www.example.com/
的引用者几乎可以通过所有的检查。制作此类网站并发送跨域请求非常简单。
有一个可靠和安全的方法来检查是否referer是真的您的域名。当然引用者可能被欺骗,但攻击者网站的受害者会发送正确的引用者。
诀窍在于^
特殊字符。这里是神奇的正则表达式:
^https?://(([a-z0-9-]+)\.)*example\.com/
^
- 确保我们在一开始
https?
- 协议 - HTTP或HTTPS
(([a-z0-9-]+)\.)*
- 匹配的子域,也是更高的水平,如果有的话
example\.com
- 比赛主域
/
- 确保路径启动,因此域名无法继续
请注意,除非您可以控制浏览器访问此脚本,否则您不能非常多的HTTP_REFERRER。它通常是空的,例如,如果从SSL站点重定向,或者用户设置浏览器安全设置以防止发送HTTP_REFERRER。 – 2011-02-17 18:29:10
是的,我不需要强烈依赖它,这是一个额外的验证。 – JakeSteam 2011-02-17 18:34:57