【问题标题】:Determining Referer in PHP在 PHP 中确定引用者
【发布时间】:2010-09-15 00:34:40
【问题描述】:

确定当前页面发送或调用(通过 AJAX)哪个页面的最可靠和最安全的方法是什么。由于(缺乏)可靠性,我不想使用$_SERVER['HTTP_REFERER'],并且我需要调用的页面仅来自源自我网站的请求。

编辑:我希望验证执行一系列操作的脚本是否正在从我网站上的页面调用。

【问题讨论】:

  • 为什么说$_SERVER['HTTP_REFERER']不靠谱?
  • PHP 实现是可靠的。问题是从来没有浏览器发送这个,如果你愿意,你甚至可以修改它。因此,从客户端的角度来看是正确的并不可靠。
  • 一种可能的方法是在页面的一个字段中放置一个唯一键(例如 GUID),然后在下一个请求中将其发回。
  • 找出服务器的IP地址并使用$_SERVER[REMOTE_ADDR]

标签: php http-referer


【解决方案1】:

REFERER 是由客户端的浏览器作为 HTTP 协议的一部分发送的,因此确实不可靠。它可能不存在,也可能是伪造的,如果出于安全原因,您就不能信任它。

如果您想验证请求是否来自您的站点,那么您不能,但您可以验证用户是否访问过您的站点和/或已通过身份验证。 Cookie 在 AJAX 请求中发送,因此您可以依赖它。

【讨论】:

  • 如果要使用这种方法,还是要检查referrer,防止CSRFen.wikipedia.org/wiki/Cross-site_request_forgery
  • 理想情况下,您应该为每个用户的每个会话使用一个唯一令牌(如果您偏执,则按请求)来防止 CSRF 攻击。检查引用者只是混淆的安全性,并不是真正的解决方案。
  • @Seldaek 不,检查引用者不是“混淆安全”。试图执行 CSRF 攻击的攻击者无法控制受害者浏览器发送的引用,因此检查它确实可以防止 CSRF。但是,我会坚持您的结论,即您应该改用 CSRF 令牌,因为引用者检查方法有 disadvantages 包括如果您在您的网站上有一个开放的重定向并且破坏了剥离引用者的用户代理,那么您将很容易受到攻击.
  • @MarkAmery 当然,这完全取决于您要防御什么,但是使用特定于客户端的 http 标头总体上不是一个非常强大的安全模型。
【解决方案2】:

我发现最好的是一个 CSRF 令牌,并将其保存在会话中,以便您需要验证引荐来源网址。

所以如果你正在生成一个 FB 回调,那么它看起来像这样:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

那么 index.php 将如下所示:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

我确实知道一些安全网站对其所有安全页面都执行相同的操作。

【讨论】:

【解决方案3】:

使用$_SERVER['HTTP_REFERER']

将用户代理引至 当前页面。这是由用户代理设置的。并非所有用户代理都会 设置这个,有些提供修改 HTTP_REFERER 作为 特征。简而言之,它不能真正被信任。

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

【讨论】:

    【解决方案4】:

    没有可靠的方法来检查这一点。它真的在客户的手下告诉你它来自哪里。您可以想象只在您网站的某些页面上使用 cookie 或会话信息,但这样做会破坏书签的用户体验。

    【讨论】:

      【解决方案5】:

      在阅读了所有虚假推荐人问题后,我们只剩下一个选项: IE。 我们希望作为引荐来源网址跟踪的页面应保留在会话中,并作为 ajax 调用,然后检查会话是否具有引荐来源页面值并执行其他操作,否则不执行操作。

      另一方面,当他请求任何不同的页面时,将引荐来源会话值设为 null。

      请记住,会话变量仅在请求页面请求时设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 2017-11-03
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多