检查PHP引用者

Jak*_*eam 5 php regex

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

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

谢谢!

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

ser*_*dev 21

应该这样做:

$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
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*c B 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
}
Run Code Online (Sandbox Code Playgroud)

当然,这只有在引用者"很好"的情况下才有效.例如,来自谷歌你可能在某个地方的搜索词中有"example.org",在这种情况下strpos会看到它,并重定向,即使你来自谷歌.

  • 如果攻击者的页面地址是"http :: //evil-attacker.org/example.com/...",该怎么办? (6认同)
  • 如果允许的主机是`iana.org`并且引用者是`www.iana.org.nyud.net`怎么办?**(实际域名)** (5认同)

Zaf*_*ffy 5

其他答案的检查是好的,但并不严格绑定到您的网站。因此,例如具有值的引用http://attacker.com/www.example.com/将通过几乎所有检查。制作这样的网站非常容易,只需发送跨域请求即可。

有一种可靠且安全的方法可以检查引用者是否真的是您的域。当然referer 可以被欺骗,但是攻击者站点的受害者会发送正确的referer。

诀窍在于^特殊性质。这是神奇的正则表达式:

^https?://(([a-z0-9-]+)\.)*example\.com/
Run Code Online (Sandbox Code Playgroud)

^- 确保我们在开始
https?- 协议 - http 或 https
(([a-z0-9-]+)\.)*- 匹配子域,如果有的话,也是更高级别的
example\.com- 匹配主域
/- 确保路径的开始,这样域名就不能继续

  • @alekwisnia 不...问号意味着它之前的字符最多可能出现一次(所以它也可能是 0 次)。所以`https?` 匹配`http` 和`https` 而你的例子匹配`htt` 和`http` (3认同)