10

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

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

问题:

  • 这从一开始就使用javascript有根本性的缺陷吗?我看到编写一个仅更改值和重新投票的脚本的巨大潜力。(也许我可以通过 ajax 调用验证前端数据是否正确以及用户是否存在?)
  • 我的应用程序获得成功的机会非常大,这是否会导致过多的前端计算?

编辑: 我很抱歉,但我忽略了一个关键事实,即我确实有一个更大的后端系统(WordPress)来处理身份验证。我正在开发的应用程序在很大程度上独立于 wordpress。我只是出于过滤目的提取一些用户信息。我选择 Firebase 作为其实时功能的存储解决方案。

我希望通过以下几种方法打击选民欺诈:

  • 低奖励$ 100 /月赠送。
  • 登录不是妥协,我实际上希望用户通过人眼注册和验证才有资格投票。其他人可以见证比赛,但不能投票。
  • 服务器端检查。如果我的应用程序受欢迎,我可以编写脚本来监控投票模式是否存在违规行为?如果有人滥用系统,我会禁用他们获胜的能力。
4

4 回答 4

8

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

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

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

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

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

于 2013-05-31T18:56:02.647 回答
3

这是你可能应该做的:

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

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

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

希望能帮助到你..

于 2013-05-31T18:14:57.790 回答
2

没有办法防止重复投票,而是强制用户注册(可能通过电子邮件确认)并进行身份验证(因此,将投票存储在数据库中的某个位置并进行检查)。其他技术存在缺陷:

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

尽管如此,一个用户可以注册多个帐户,并且没有办法阻止这种情况。

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

于 2013-05-31T18:13:17.190 回答
1

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

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

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

于 2013-05-31T18:47:26.380 回答