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)
$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://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- 匹配主域
/- 确保路径的开始,这样域名就不能继续