检查 PHP 中的引用者

Posted

技术标签:

【中文标题】检查 PHP 中的引用者【英文标题】:Inspect the referrer in PHP 【发布时间】:2010-09-30 10:06:55 【问题描述】:

是否可以检查谁在 php 中进入您的网站。我有一个 Web 应用程序(用 PHP 编写),它只允许用户从某些特定网站进入。是否可以通过检查_Request 对象获得推荐网站?如果是,怎么做?

【问题讨论】:

【参考方案1】:

是的,但请记住,一些代理和其他东西会删除此信息,并且很容易伪造。所以永远不要依赖它。例如,不要认为您的 Web 应用程序对 CSRF 是安全的,因为您检查了引荐来源网址以匹配您自己的服务器。

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

如果您只想允许来自特定域的请求,则需要解析一些 URL 以获取***域。据我了解,这可以通过 PHP 的 parse_url() 来完成。

正如andyk 在 cmets 中指出的那样,您还必须允许 www.example.com 和 example.com。

【讨论】:

但是, 可能需要格外小心,因为您可能需要同时允许 www.example.com 和 example.com,因为在大多数情况下,它们是相同的。更不用说 HTTP_REFERER 并不是真正可信的。 来自php手册,“这是由用户代理设置的。并不是所有的用户代理都会设置这个,有些提供修改HTTP_REFERER的能力作为一个特性。总之,它不能真正被信任。” 是的,我知道它不能被信任。 Referer 在 RFC 中拼写错误,因此在所有 HTTP 领域中,它都是 Referer 而不是 Referrer 是的,改用 HTTP_REFERRER 犯了一次错误。我花了一段时间才弄清楚出了什么问题。 :-s【参考方案2】:

虽然您可以查看 $_SERVER['HTTP_REFERER'] 以获取推荐网站,但不要将农场押在上面。浏览器设置了这个头部,很容易被欺骗。

如果只有来自特定推荐人的人才能查看您的网站至关重要,请不要使用此方法。您必须找到另一种方法,例如基本身份验证,来保护您的内容。我并不是说你不应该使用这种技术,只是请记住它不是万无一失的。

顺便说一句,您还可以在 apache 级别 using mod_rewrite 阻止引荐来源网址。

【讨论】:

【参考方案3】:

您不能信任推荐人。尽管来自 $_SERVER 数组,但它实际上是用户/浏览器提供的值,并且很容易被伪造,使用诸如 Firefox 之类的东西 RefControl addon。

【讨论】:

是的,FF 不支持它。我正在寻找替代品。【参考方案4】:

您需要检查 $_SERVER 数组中的“HTTP_REFERER”键。

【讨论】:

以上是关于检查 PHP 中的引用者的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iFrame 中使用 JavaScript 获取 iFrame 父页面的引用者?

如何检查调用者是不是设置了 PowerShell 可选参数

使用 gdb 检查调用者帧

领事与 API 网关

如何检查调用者是否设置了PowerShell可选参数

求助stm32程序小问题