在PHP中检查引荐来源

18

在PHP中,是否有可能检查谁正在进入您的网站。我有一个Web应用程序(用PHP编写),只应允许从某些特定网站进入的用户。通过检查_Request对象来获取引荐网站是否可行?如果是,如何操作?

4个回答

28

可以,但要记住一些代理和其他工具可能会去除此信息,并且它很容易被伪造。因此永远不要依赖它。例如,不要仅检查引用者是否与您自己的服务器匹配,就认为您的Web应用程序受到CSRF的保护。

$referringSite = $_SERVER['HTTP_REFERER']; // is that spelt wrong in PHP ?

如果您只希望允许来自特定域名的请求,您需要解析一些 URL 来获取顶级域名。正如我所学到的那样,这可以使用 PHP 的 parse_url() 函数来完成。

正如 andyk 在评论中指出的那样,您还需要允许 www.example.com 和 example.com。


1
从PHP手册中,“这是由用户代理设置的。并非所有用户代理都会设置它,有些提供修改HTTP_REFERER作为功能的能力。简而言之,它不能真正被信任。” - andyk
15
“Referer”在RFC中拼错了,因此在HTTP领域中,它被称为“Referer”,而不是“Referrer”。 - Rob
1
是的,我曾经犯过一个错误,使用了HTTP_REFERRER。花了我一段时间才弄清楚问题出在哪里。:-s - andyk
@andyk:这就是为什么我特别喜欢代码高亮,尤其是针对PHP的。哦,顺便说一下,我下周要去印度尼西亚旅游! - alex
无法在FF中使用301重定向工作->http://stackoverflow.com/questions/21356193/getting-the-domain-of-a-301-redirected-url-with-masking-enabled - Ben Racicot
显示剩余5条评论

7
虽然您可以查看$_SERVER['HTTP_REFERER']来获取引用站点,但不要把所有赌注都押在上面。浏览器设置此标头并且很容易被欺骗。
如果仅允许特定引荐者的人查看您的网站,则不要使用此方法。您必须找到另一种方法(例如基本身份验证)来保护您的内容。我并不是说您不应该使用此技术,只是要记住它并不是绝对可靠的。
顺便说一下,您还可以使用mod_rewrite在Apache级别上阻止引荐者。

4

您不能信任引用者。尽管它来自$_SERVER数组,但它实际上是用户/浏览器提供的值,并且可以轻松伪造,使用例如Firefox的RefControl插件等工具。


是的,FF不支持它。我正在寻找替代方案。 - Ben Racicot

0
你需要检查 $_SERVER 数组中的 'HTTP_REFERER' 键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接