我正在创建一个以 Apache2 作为服务器的 django 网站。我需要一种方法来确定我的网站(特别是每个页面)的唯一访问者数量,以完全证明的方式。不幸的是,用户将有很高的动机去尝试“游戏”跟踪系统,所以我试图让它充分证明。
有没有办法做到这一点?
目前我正在尝试使用 IP 和 Cookie 来确定唯一身份访问者,但这个系统很容易被无头浏览器所欺骗。
除非有必要将数据集成到您的 Django 数据库中,否则我强烈建议您将流量“外包”给其他提供商。我对 Google Analytics(分析)非常满意。
如果做不到这一点,你几乎无法阻止某人玩这个系统。您可以基于 IP 地址进行限制,但当然会遇到许多唯一访问者经常共享 IP(例如,通过大学、组织或工作站点)的问题。饼干很容易清除,所以如果你走这条路,那么游戏就很容易了。
难以摆脱的一件事是存储在 appcache 中的文件,因此适用于现代浏览器的一种可能的解决方案是将文件存储在 appcache 中。您将第一次加载它计为唯一访问,之后由于它被缓存,它们不会再次被计算在内。
当然,既然您可能需要它向后兼容,那么它当然会完全开放给最有可能用于游戏系统的各种工具,例如 curl。
您当然可以阻止非浏览器类用户代理,如果一些游戏玩家不知道欺骗浏览器代理字符串(大多数人会很快学会),这会稍微困难一些。
确实,最好的解决方案可能是——访问页面的结果是什么?例如,如果是销售产品,则不要奖励页面浏览量最多的人;奖励那些点击产生最多销售额的人。或者某人可能在页面上采取的任何耗时的操作。
如果您愿意忽略禁用 JavaScript 的人,则可以选择仅计算访问该页面的人,然后在给定的时间窗口(例如 1 分钟)内停留在该页面上。在给定的一段时间后,向服务器发送一个 Ajax 请求。因此,如果他们试图通过更改 cookie 并一次加载多个选项卡来进行游戏,那将无法正常工作,因为他们需要拥有相同的 cookie 才能注册他们已经在该页面上停留了足够长的时间。我实际上认为这可能有效;老实说,我看不出有什么方法可以玩这个。基本上在服务器端,您存储一个字典stay_until
,request.session
其中包含每个唯一页面的键,并在大约 1 分钟后运行 Ajax 调用回服务器。如果值为stay_until[page_id]
小于或等于当前时间,则他们是活跃用户,否则他们不是。这意味着某人至少需要20 分钟才能产生 20 个唯一身份访问者,并且只要您使回报的价值低于所消耗的时间,这将是一个强大的抑制因素。
我什至会更明确地说明:在页面底部的noscript
标签中,将“您的访问未计算在内。打开 JavaScript 进行计数”,并带有一个展示跟踪过程的页面。
由于 HTML 请求是无状态的,并且您无法控制用户在其客户端的行为,因此没有防弹的方法。
您能够以万无一失的方式跟踪“唯一”访问者的唯一方法是使其取决于某些受控因素,例如登录。其他任何事情都可以而且不会完全准确。