防止 cURL Referrer 欺骗攻击

18

我们从开发人员那里收到了一段PHP代码,其中包含一个仅依赖于 $_SERVER['HTTP_REFERER'] 的网页统计脚本。使用cURL,可以轻松地进行如下伪造:

curl_setopt($curl, CURLOPT_REFERER, "client website");

我希望找到一种方法来防止这种欺骗行为。甚至客户端网站也可以通过此方式获得更高的统计数据。我正在寻找一种方法来防止这种欺骗行为。这是否可能?如果可能,如何实现?


你做不到。最好的方法是过滤掉明显无效的引荐者,接受其余难以区分的欺骗行为作为误差范围。 - Dan Bechard
最终的目标是防止欺骗,识别发出请求的客户端吗?因为如果是这样,可以使用浏览器指纹。它不是100%准确的,但它已经尽可能地好了,在大多数情况下,它将非常接近于唯一识别客户端。 - PatomaS
这个问题类似于 https://dev59.com/4nVC5IYBdhLWcg3w2k-I 解决方案是使用自定义引荐令牌,该令牌经过加密签名并可以在服务器端进行验证。但是这将要求您与发送流量的页面密切合作 - 而您也不想信任它们,我理解的是这样。 - pixelistik
@PatomaS 的目标是收集客户网站的实际统计数据,而不让任何人为地增加它。虽然不确定浏览器指纹识别如何帮助我们。 - demechanico
@demechanico:当我看到你的问题时,我曾经想过一会儿,你想要识别客户端(Web浏览器),而不是页面。浏览器指纹可以用来检测客户端,但不能检测页面。所以这是我的错误,没有正确理解你的问题。 - PatomaS
显示剩余2条评论
2个回答

11

没有确定的方法可以确定URL Referrer。

根据 HTTP规范HTTP_REFERER是可选的。一些防火墙软件默认会剥夺这些,有些客户端不发送引用者值,而且有许多方法(就像你在问题中展示的那样)来修改这个值。

简而言之,HTTP_REFERER的值不能被信任。总会有一些方法来修改这些值。在 $_SERVER PHP 手册文档 中提到了这一点 (重点在于):

页面地址(如果有的话)将用户代理引用到当前页面。这是由用户代理设置的。并非所有用户代理都会设置这个,有些用户代理提供了修改 HTTP_REFERER 的功能。简而言之,它确实无法被信任

回答您的问题:不,没有任何方法可以防止修改HTTP_REFERER的值。建议您在使用前仔细检查该值(可选的,在其上应用 htmlspecialchars() 以防止注入),或者根本不使用它。不幸的是,这是一个“拿着就走”的交易。


1
OP已经知道它可以被伪造。但他正在寻找通过其他方式防止这个问题的方法... - Shankar Narayana Damodaran
1
@ShankarDamodaran:但是没有办法。我以为这回答了这个问题,但我已经更新了答案来反映这一事实。如果你知道如何防止这个问题,请随时发布它作为答案 :) - Amal Murali
非常感谢,但我确实希望能得到一些(至少部分有效的)解决方案。如果我找不到处理它的方法,我将实现一些审计代码,清理看似虚假的统计数据。注意:我可以轻松忽略没有HTTP_REFERRER的请求,这只会对客户产生小幅度的影响(因为大多数浏览器都提供它?!)。 - demechanico
1
@demechanico:如果用户手动输入网址,那么该值不会被发送。进行<meta>刷新时,也不会发送该值。请参阅此处以获取有关不传递HTTP_REFERRER值的浏览器信息。 - Amal Murali
@AmalMurali:感谢您分享这个资源,它很有启发性。死路一条?! - demechanico
@demechanico:我也这么认为。现在你可以等待更有见地的答案(因为今天是星期天,大多数人都不活跃)。或者,你可以尝试在[security.se]上提出你的问题。 - Amal Murali

0

关于这种 referrer 伪造,你无能为力。所有的 web-stats 脚本都要依赖于这个 referrer。即使是包括谷歌分析在内的巨型 web-stats 网站也被这个伪造的 referrer 所骗。

一个不错的解决方案是检查一下 referrer 的 URL。我是说,访问那个 referrer 并检查你的 URL 是否存在于其中。但是这当然很费时间、慢,并且需要大量的带宽。然而这还不足以克服这个问题。

以下是几个问题,如果你正在追踪回 referrer 的 URL,你将无法找到你的链接:

  • 如果引用的 URL 在会话后面呢?例如,链接来自电子邮件,如雅虎、谷歌或私人论坛。

  • 如果链接来自于 javascript 链接/点击呢?

  • 来自于 iframe 的链接同样也是 javascript 链接。


感谢您的输入。好的,这段代码应该来自客户网站,它应该能够保持网站的浏览量统计。我最担心的是那些试图通过虚假请求来增加他们的统计数据的网站。因此,从您上面列出的内容中,iframe 是我们唯一可能会遇到的问题。 - demechanico

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