我们从开发人员那里收到了一段PHP代码,其中包含一个仅依赖于 $_SERVER['HTTP_REFERER']
的网页统计脚本。使用cURL,可以轻松地进行如下伪造:
curl_setopt($curl, CURLOPT_REFERER, "client website");
我希望找到一种方法来防止这种欺骗行为。甚至客户端网站也可以通过此方式获得更高的统计数据。我正在寻找一种方法来防止这种欺骗行为。这是否可能?如果可能,如何实现?
我们从开发人员那里收到了一段PHP代码,其中包含一个仅依赖于 $_SERVER['HTTP_REFERER']
的网页统计脚本。使用cURL,可以轻松地进行如下伪造:
curl_setopt($curl, CURLOPT_REFERER, "client website");
我希望找到一种方法来防止这种欺骗行为。甚至客户端网站也可以通过此方式获得更高的统计数据。我正在寻找一种方法来防止这种欺骗行为。这是否可能?如果可能,如何实现?
根据 HTTP规范,HTTP_REFERER
是可选的。一些防火墙软件默认会剥夺这些,有些客户端不发送引用者值,而且有许多方法(就像你在问题中展示的那样)来修改这个值。
简而言之,HTTP_REFERER
的值不能被信任。总会有一些方法来修改这些值。在 $_SERVER
PHP 手册文档 中提到了这一点 (重点在于):
页面地址(如果有的话)将用户代理引用到当前页面。这是由用户代理设置的。并非所有用户代理都会设置这个,有些用户代理提供了修改 HTTP_REFERER 的功能。简而言之,它确实无法被信任。
回答您的问题:不,没有任何方法可以防止修改HTTP_REFERER
的值。建议您在使用前仔细检查该值(可选的,在其上应用 htmlspecialchars()
以防止注入),或者根本不使用它。不幸的是,这是一个“拿着就走”的交易。
<meta>
刷新时,也不会发送该值。请参阅此处以获取有关不传递HTTP_REFERRER
值的浏览器信息。 - Amal Murali关于这种 referrer
伪造,你无能为力。所有的 web-stats
脚本都要依赖于这个 referrer
。即使是包括谷歌分析在内的巨型 web-stats
网站也被这个伪造的 referrer
所骗。
一个不错的解决方案是检查一下 referrer
的 URL。我是说,访问那个 referrer
并检查你的 URL 是否存在于其中。但是这当然很费时间、慢,并且需要大量的带宽。然而这还不足以克服这个问题。
以下是几个问题,如果你正在追踪回 referrer
的 URL,你将无法找到你的链接:
如果引用的 URL 在会话后面呢?例如,链接来自电子邮件,如雅虎、谷歌或私人论坛。
如果链接来自于 javascript
链接/点击呢?
来自于 iframe
的链接同样也是 javascript
链接。