阻止用户发布虚假的AJAX请求(确保AJAX请求仅来自应用)

时间:2012-07-12 14:27:00

标签: ruby-on-rails ajax security

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

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

Edit2:找到similar SO question处理此问题。听起来像答案是,混淆安全是最好的选择。保证安全是不可能的。因此,任何有关加密工具等的建议都会使AJAX调用的内容难以阅读。

5 个答案:

答案 0 :(得分:1)

与其试图阻止人们作弊,你应该专注于尽量减少骗子对非欺骗者的不利影响:

如果业力被用作“高分”并且你担心用户获得业力的速度比他们应该更快,那么考虑保留他们最后一次获得业力的时间戳,如果太快就拒绝请求,并且/或设置所赚取的业力的每日限额,以便当他们不在键盘时他们无法自动完成该过程。

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

答案 1 :(得分:0)

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

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

但我认为这是一种黑客行为:)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

总的来说,我不太愿意发布安全建议,但由于这只是为了增加应用程序中的业力,我会试一试。

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

  1. 他们是谁(用户名)。
  2. 他们想要增加的人数(用户名)。
  3. 您在登录时给予他们的密钥的HMAC摘要以及两个用户名的串联。
  4. 服务器然后在上面的(1)中查找用户名的密钥,并将加载密钥的HMAC摘要与用户名的串联与上面(3)中提供的HMAC摘要进行比较。

    你可以直接拒绝(1)和(2)中的用户名相等比较的情况 - 这将阻止用户增加他们自己的业力。

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

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

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

答案 4 :(得分:0)

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

if current_user.id == karma.user_id
  #... throw error
else
  karma.save
end