代码之家  ›  专栏  ›  技术社区  ›  Bo Jeanes

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

  •  31
  • Bo Jeanes  · 技术社区  · 15 年前

    首先,我尽我所能地搜索并阅读所有看起来相关的问题,但没有任何具体的答案。这不是复制品,阿法克。

    显然,如果允许在网站上匿名投票,就没有一种简单的方法可以阻止某人多次投票。

    然而,我想知道,是否有经验的人可以帮助我想出一个相当可靠的方法来跟踪绝对独特的访客和记录反对这些证件的投票。

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

    根据IP记录似乎是下一个合理的解决方案,但我想知道这是否会经常出现误报(在一个NAT后面的同一个LAN上的多个人将拥有相同的外部IP,等等)。

    这里有没有中间地带,或者我忽略的其他方法/组合?

    8 回复  |  直到 15 年前
        1
  •  22
  •   mlambie    15 年前

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

    如果希望允许多个投票,请记录哈希值并增加一个计数器。在salt中包含一个时间戳(每天、每小时等),使投票时间敏感,例如每天5票。

        2
  •  12
  •   MSalters    15 年前

    中国人必须与数百人共享一个IPv4地址;HP/Compaq/DEC拥有近5000万个地址。ipv6没有帮助,因为每个人都能获得十亿个地址。一个人只是和一个IP地址不一样,这个概念变得越来越错误。

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

    当然,您可以将每个IP的投票量与该IP的重复页面访问量联系起来,特别是与cookie跟踪结合使用时。如果您在开始投票期之前估计这个数字,这是最有效的方法。如果最受欢迎的5%文章通常是从一个IP上读10次,那么很可能有10个人分享这个IP,他们应该得到10票。cookies可以用来防止他们窃取对方的选票,但总的来说,他们不能影响你的投票。(注:这在小社区中是失败的,那里有大量的选民来自少数IP,尤其是在大学周围)。

        3
  •  11
  •   ben_h    15 年前

    最简单的答案是使用cookie。很明显,这很容易被人们清除他们的cookie,但匿名投票本质上是近似的。

    在实践中,除非被投票的主题在某种程度上具有争议性或煽动性,否则人们不会有任何动机去操纵投票。

    IP更“可靠”,但由于NATS,它将产生无法接受的高级别冲突。

    由IP+用户代理(可能是哈希)组成的更唯一的标识符如何?这实际上意味着对于每个IP,每个确切的OS/BROWSER版本对获得1票,这更接近于每人1票。大多数浏览器在用户代理中提供了详细的版本信息——我不确定,但我的直觉是,这可以防止大多数由nats引起的冲突。

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

        4
  •  3
  •   Codebeef    15 年前

    如果你不想认证选民,那么不管你用什么,你都会得到一些重复的选票。我会使用一个cookie,并为匿名用户使用它。

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

        5
  •  3
  •   lstoll    15 年前

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

    持久的 曲奇将是你最好的选择,你必须接受这样一个事实:它很容易玩。至少当cookie是持久的(而不是基于会话的)时,您将捕获运行单个浏览器的大多数用户。

    如果你真的想依赖结果,你必须在这个过程中添加某种形式的标识(比如电子邮件验证,它仍然是可玩的)。

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

        6
  •  3
  •   Victor    15 年前

    使用持久cookie只允许对每个项目进行一次投票

    如果IP超过100(1000?),则记录IP。10000?)请求少于x分钟,然后“软块”IP

    “软阻止”:不要显示一个显示“您的IP已被阻止”的页面,而是显示“感谢您的投票”页面,不要在数据库中记录投票。您甚至可以只增加该IP的计数器。你想阻止他们知道你在阻止他们的IP。

        7
  •  1
  •   grahamparks    15 年前

    两个尚未提及的想法是:

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

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

        8
  •  0
  •   Paganwinter    14 年前

    我也有同样的问题,这就是我计划要做的……

    设置持久cookie。检查cookie以决定是否可以投特定的票。 另外,以IP地址+用户代理的组合形式存储投票请求的一些数据。然后使用这个值将投票数限制为每天10票。

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