2011-02-17 79 views
4

所以,我需要检查引用到使用php的页面,如果它是* .example.com或* .anothersite.com,执行代码,但如果不是,重定向到其他地方。检查PHP引用链接

我该如何去检查HTTP_REFERER是否等于那些具有通配符的值?

谢谢!

编辑:该网址将包含多个域,所以正则表达式需要匹配找到的第一个发生。

+1

请注意,除非您可以控制浏览器访问此脚本,否则您不能非常多的HTTP_REFERRER。它通常是空的,例如,如果从SSL站点重定向,或者用户设置浏览器安全设置以防止发送HTTP_REFERRER。 – 2011-02-17 18:29:10

+0

是的,我不需要强烈依赖它,这是一个额外的验证。 – JakeSteam 2011-02-17 18:34:57

回答

4
$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会看到它,并重定向,即使你来自谷歌。

+0

这原来是我所需要的。我过于复杂的事情。谢谢! – JakeSteam 2011-02-17 18:39:48

+5

如果允许的主机是`iana.org`而引用者是`www.iana.org.nyud.net`,该怎么办?**(实际域)** – seriousdev 2011-02-17 18:55:45

1

试试这个:

if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER'])) 
{ 
    // execute your code 
} 
else 
{ 
    header("Location: http://example.com/redirectpage.htm"); 
    exit(); 
} 
1

preg_match('/(.+?)\.example\.(com|org)/',$_SERVER['HTTP_REFERER'])

这将只匹配了子域的地址,也不会继续寻求超越subdomain.example.com.org什么。即subdomain.example.com/some-other-stuff。你是否也需要匹配其中之一?

更正 - 这将匹配www.example.com,但不会匹配example.com

13

应该这样做:

$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 
} 
2

其他答案检查是好的,但并不严格绑定到你的网站。因此,例如价值http://attacker.com/www.example.com/的引用者几乎可以通过所有的检查。制作此类网站并发送跨域请求非常简单。

有一个可靠和安全的方法来检查是否referer是真的您的域名。当然引用者可能被欺骗,但攻击者网站的受害者会发送正确的引用者。

诀窍在于^特殊字符。这里是神奇的正则表达式:

^https?://(([a-z0-9-]+)\.)*example\.com/ 

^ - 确保我们在一开始
https? - 协议 - HTTP或HTTPS
(([a-z0-9-]+)\.)* - 匹配的子域,也是更高的水平,如果有的话
example\.com - 比赛主域
/ - 确保路径启动,因此域名无法继续