什么是记录匿名用户投票的可靠方法,不允许重复

时间:2009-06-24 13:17:01

标签: session web-applications

首先,我尽可能地搜索并阅读所有似乎相关的SO问题,但没有具体回答这个问题。这不是重复,afaik。

显然,如果允许在网站上进行匿名投票,则没有万无一失的方法可以阻止某人多次投票。

但是,我想知道有经验的人是否可以帮助我提出一个相当可靠的方法来跟踪绝对独特的访问者并记录对这些凭据的投票。

目前,我确保每个项目/会话组合只允许一次投票,但通过重新启动浏览器,更改浏览器/计算机或清除会话数据可以轻松避免这种情况。

针对IP进行录制似乎是下一个合理的解决方案,但我想知道这是否会经常出现误报(NAT后面的同一局域网中的多个人会有相同的外部IP等)。

这里有中间地带或我忽视的其他方法/组合吗?

8 个答案:

答案 0 :(得分:22)

我会收集尽可能多的关于会话的数据,而不直接询问任何问题(浏览器,操作系统,已安装的插件,所有版本号,IP地址等)并将其哈希。

如果您想要允许多个投票,请记录哈希并递增计数器。在盐中加入时间戳(每日,每小时等)以使投票时间敏感,比如说每天5票。

答案 1 :(得分:12)

中国人必须与其他数百人分享一个IPv4地址; Hp / Compaq / DEC拥有近5000万个地址。 IPv6并没有帮助,因为每个人都获得了数十亿的地址。一个人与IP地址不同,而且这个概念变得越来越虚假。

在互联网上没有正确的方法可以做到这一点。人们只是互联网上未知的概念,任何介绍这一概念的想法都不可能成功。 (例如,太多的政府不希望这种情况发生。)

当然,您可以将每个IP的投票数量与该IP重复页面访问的数量相关联,尤其是与Cookie跟踪相结合。如果您在开始投票期之前估计该数字,则效果最佳。如果前5%的热门文章通常从单个IP中读取10次,则可能有10人共享该IP,他们应该获得10票。 Cookie可以用来防止他们窃取对方投票,但总的来说他们不能扭曲你的民意调查。 (注意:在小型社区中,这种情况失败了,其中大量选民来自少数知识产权,特别是大学附近的选民。)

答案 2 :(得分:11)

最简单的答案是使用cookie。显然,人们很容易清除他们的cookie,但无论如何,匿名投票本身就是近似的。

在实践中,除非投票的主题在某种程度上存在争议或煽动性,否则人们无论如何都不会有动机操纵投票。

IP更“可靠”,但由于NAT会产生无法接受的高水平冲突。

由IP +用户代理(可能是哈希)组成的更独特的标识符怎么样?这实际上意味着对于每个IP,每个确切的操作系统/浏览器版本对获得1票,这更接近每人1票。大多数浏览器在用户代理中提供详细的版本信息 - 我不确定,但我的直觉是这样可以防止NAT引起的大多数冲突。

唯一仍会产生大量冲突的地方是拥有标准化网络的企业环境,每个人都使用相同的机器。

答案 3 :(得分:3)

如果您不是在考虑对选民进行身份验证,那么无论您使用什么,您都将获得一些重复投票。我使用cookie,并为匿名用户完成了它。

UserVoice允许在登录时进行匿名投票和投票,但随后允许管理员过滤掉匿名投票 - 这是解决此问题的一个很好的解决方案。

答案 4 :(得分:3)

任何基于IP地址的东西都不是一个选项 - 已经提到了NAT的情况,但这似乎只是家庭用户的情况。有许多大型安装使用NAT - 一些公司可以将数千个用户集中在一个IP地址后面。还有一些ISP为其用户使用代理服务器 - 另一种情况是,您可以将数千名用户作为单个地址显示在您的应用程序中。添加独特的UA组合对此没有帮助,因为没有足够的变化。

持久性 Cookie将是您最好的选择 - 您将不得不忍受这样一个事实:它很容易游戏。至少当cookie是持久的(而不是基于会话的)时,你会抓住大多数运行单个浏览器的用户。

如果您真的想依赖结果,那么您将不得不在此过程中添加某种形式的身份证明(例如电子邮件验证,这仍然可以游戏)。

在一天结束时,任何互联网调查都会有缺陷(例如: http://www.time.com/time/arts/article/0,8599,1894028,00.html),你将不得不忍受这个。

答案 5 :(得分:3)

使用持久性cookie只允许每个项目投票

记录IP,如果在少于X分钟内有超过100(1,000?10,000?)个请求,则“软阻塞”IP

“软块”:不显示“您的IP已被阻止”的页面,但显示您的“谢谢您的投票”页面并且不要在您的数据库中记录投票。您甚至可以仅增加该IP的计数器。您希望阻止他们知道您阻止了他们的IP。

答案 6 :(得分:1)

尚未提及的两个想法是:

  • 询问用户的电子邮件地址并通过电子邮件向他们发送验证链接
  • 使用验证码

显然,前者可以通过一次性电子邮件地址等来规避,但会为您提供审计跟踪,并为临时/机器人投票填充提供了重大障碍。一个好的验证码同样会严重限制投票填充,但是关于它们的使用有着所有常见的警告。

答案 7 :(得分:0)

我有同样的问题,这就是我打算做的......

设置持久性cookie。检查cookie以确定是否可以投票。 另外,以IP地址+用户代理的组合形式存储关于投票请求的一些数据。然后使用此值来限制否。例如,每天10票。

创建此哈希(IP + UA字符串)的最佳方法是什么?