10

我正在开发一个网络应用程序,其中某些操作会为用户赢得“业力”。业力增量是一个简单的 AJAX 请求,它增加数据库中的一个数字。现在有什么办法可以防止用户手动发出重复的 AJAX 请求并一次又一次地增加自己的分数?

编辑:获得用户业力的活动都是使用 javascript 在客户端发生的。因此,服务器无法知道它是来自应用程序的“真实”请求还是由用户在控制台上键入 $.post 创建的“假”请求。

Edit2:找到了一个类似的 SO question来处理这个问题。听起来答案是,通过混淆来确保安全是最好的选择。保证安全是不可能的。因此,任何有关加密工具等的建议都会使 AJAX 调用的内容更难阅读,我们将不胜感激。

4

5 回答 5

1

与其试图阻止人们作弊,不如专注于尽量减少作弊者对非作弊者的不利影响:

如果业力被用作“高分”并且您担心用户获得业力的速度比他们应该考虑保留他们最后一次获得业力的时间戳,如果太早拒绝请求和/或设置业力的每日限制,因此当他们不在键盘前时,他们无法自动化该过程。

如果为用户赚取业力的操作也对其他用户产生影响,那么它应该是一个触发这两种效果的 ajax 调用。

于 2013-05-15T16:37:44.800 回答
0

您可以检查登录用户是否是业力所有者,如下所示:

if current_user.id == karma.user_id
  #... throw error
else
  karma.save
end
于 2012-07-12T18:20:14.410 回答
0

您的服务器应该跟踪客户端活动,以便推断 ajax 调用的执行是“逻辑”还是“假”。这可以通过会话(不推荐)来完成,因为也可以伪造(取决于某些因素),或者直接在数据库上

于 2012-07-12T14:45:24.627 回答
0

一般来说,我不太愿意提供安全建议,但因为这只是为了增加应用程序中的业力,所以我会试一试。

使用HMAC摘要怎么样?您需要在客户端登录应用程序时为他们生成一个密钥,并且客户端在增加业力时需要发送三位数据:

  1. 他们是谁(用户名)。
  2. 他们想增加谁(用户名)。
  3. 您在登录时提供给他们的密钥的 HMAC 摘要以及两个用户名的连接。

然后,服务器在上面 (1) 中查找用户名的密钥,并将加载的密钥的 HMAC 摘要和用户名的连接与上面 (3) 中提供的 HMAC 摘要进行比较。

您可以完全拒绝(1)和(2)中的用户名比较相同的情况 - 这将防止用户增加他们自己的业力。

您还可以拒绝摘要不匹配的情况 - 这将捕获用户试图欺骗业力增量请求的情况。

如果您在登录时共享的密钥被截获,其他用户可能会使用它来生成虚假的业力增量。

您应该能够找到 Ruby 和 JavaScript 的 HMAC 实现来实现这一点。

于 2012-07-12T16:37:22.587 回答
0

这个问题有几个解决方案。其中之一是“禁用”您的链接或按钮或您单击以发送 AJAX 请求的任何内容。
如果你使用 JQuery,你有一些回调:beforeSendsuccess. 您可以尝试在回调中“禁用”您的触发器,然后在(或)回调beforeSend中“启用”它。successcomplete

$.ajax({
  url: "/example",
  beforeSend: function(){
    #disable trigger
  },
  complete: function(){
    #enable trigger
  }
})

但我认为这是一种 hack :)

于 2012-07-12T14:39:38.120 回答