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

时间:2013-05-31 18:06:00

标签: javascript jquery firebase

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

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

问题:

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

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

我希望通过几种方法来打击选民欺诈行为:

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

4 个答案:

答案 0 :(得分:8)

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

然后,您可以将此与Firebase security rules结合使用,以强制执行任何已登录的用户只能提升一次。请查看安全页面上的截屏视频,以获取示例!

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

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

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

答案 1 :(得分:3)

这是你应该做的:

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

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

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

希望有所帮助......

答案 2 :(得分:1)

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

    只要用户需要,就可以禁用或清除
  1. cookie /会话存储
  2. IP地址跟踪可防止在NAT,代理和网关背后使用,因为所有客户端将共享相同的公共地址(或少量)。
  3. 但是,用户可以注册多个帐户,但无法阻止这种情况。

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

答案 3 :(得分:1)

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

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

正如大家所指出的,你必须依靠自己的服务器。