检查PHP引用者

时间:2011-02-17 18:17:47

标签: php regex

所以,我需要使用php检查引用者到页面,如果是* .example.com或* .anothersite.com,则执行代码,但如果没有,则重定向到其他地方。

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

谢谢!

编辑:网址将包含多个域名,因此正则表达式需要匹配找到的第一个域名。

5 个答案:

答案 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不匹配。