一个简单的投票系统:如何防止重复投票

我正在构建一个带有向上投票选项的简单Web应用程序。 我计划为最多投票的人提供现金奖励,所以我想要一个相对安全的系统。 我有几个关于受孕的问题。 我知道我的post与其他几个post类似,但似乎没有一个特定的平台让我放心。

我的网络应用程序正在使用javascript和firebase来加载所有正在投票的对象。 我要强制用户登录并存储IP地址,用户ID等。

问题:

  • 这是从一开始使用javascript的根本缺陷吗? 我看到编写一个只改变价值和重新投票的脚本的巨大潜力。 (也许我可以validation前端数据是否正确以及用户是否存在ajax调用?)
  • 随着我的应用程序成功的失败机会这将是太多的前端计算?

编辑:对不起,但我遗漏了一个关键事实,即我有一个更大的后端系统(WordPress)来处理身份validation。 我正在开发的应用程序基本上独立于wordpress。 我只是提取一些用户信息以进行过滤。 我选择Firebase作为其实时function的存储解决方案。

我希望用几种方法来打击选民欺诈:

  • 赠送的奖励为每月100美元。
  • 登录不是妥协,我实际上希望用户注册并用人眼validation有资格投票。 其他人可以见证比赛,但不能投票。
  • 服务器端检查。 如果我的应用程序受欢迎,我可以编写脚本来监控违规行为的投票模式吗? 如果有人滥用系统,我就会失去胜利的能力。

当然可以在客户端安全地执行此操作。 但是,正如其他人所说,它确实需要用户登录。 如果您已经在使用Firebase,那么使用FirebaseAuthClient实际上很容易实现。

然后,您可以将此与Firebase安全规则结合使用,以强制任何已登录的用户只能进行一次upvote。 查看安全页面上的截屏video,以获取示例!

您的安全规则可能如下所示:

{ "rules": { "users:" { "$userid": { "voted_on": { "$articleid": { ".write": "!data.exists()" } } } } } } 

这确保您可以将任何给定值写入/ users / anant / voted_on / article1 一次 。 您可以添加.validate规则以确保该值是布尔值(或其他值)。

这是你应该做的:

1)一旦用户投票,您应该对服务器进行ajax调用并更新数据库中的标志并使用javascript禁用投票。

2) 如果用户刷新页面并尝试再次投票 ,服务器将知道已经进行了投票(因为它保存在数据库中),因此投票系统将在页面上显示为禁用。

3)如果用户尝试通过修改页面源来使用chrome工具或firebug启用投票 ,则可以通过在userID上设置复合键和“vote”标志来创建数据库端的检查,这将阻止重复投票。

希望能帮助到你..

没有办法阻止重复投票,但强迫用户注册(可能通过电子邮件确认)并进行身份validation(因此,在您的数据库中的某处存储投票并进行检查)。 其他技术存在缺陷:

  1. 每当用户需要时,可以禁用或清除cookie /会话存储
  2. IP地址跟踪可防止在NAT,代理和网关之后使用,因为所有客户端将共享相同的公共地址(或少量)。

用户仍然可以注册多个帐户,但无法阻止这种情况发生。

您可以做的是检测可以由脚本生成的快速投票操作序列。

利用OAuth身份validation,用户不太可能通过FB / Twitter / Google / OpenID找到登录方式。

投票仍然便宜且快速,如果用户不想通过第三方服务登录,您可以提供电子邮件回退。

正如大家已经指出的那样,你必须依靠自己的服务器。