我正在开发一个网络应用,其中某些操作可以获得用户的“业力”。业力增量是一个简单的AJAX请求,它会增加数据库中的数字。现在要防止用户手动制作重复的AJAX请求并一次又一次地增加自己的分数?
编辑:赢得用户业力的活动都是使用javascript在客户端进行的。因此,服务器无法知道它是来自应用程序的“真实”请求还是用户在控制台上输入$ .post创建的“假”请求。
Edit2:找到similar SO question处理此问题。听起来像答案是,混淆安全是最好的选择。保证安全是不可能的。因此,任何有关加密工具等的建议都会使AJAX调用的内容难以阅读。
答案 0 :(得分:1)
与其试图阻止人们作弊,你应该专注于尽量减少骗子对非欺骗者的不利影响:
如果业力被用作“高分”并且你担心用户获得业力的速度比他们应该更快,那么考虑保留他们最后一次获得业力的时间戳,如果太快就拒绝请求,并且/或设置所赚取的业力的每日限额,以便当他们不在键盘时他们无法自动完成该过程。
如果为用户赚取业力的行为也会对其他用户产生影响,那么它应该是一个触发两种效果的ajax调用。
答案 1 :(得分:0)
这个问题有几个解决方案。其中之一是“禁用”您的链接或按钮或您点击发送AJAX请求的任何内容
如果你使用JQuery,你会有一些回调:beforeSend
和success
。
您可以尝试在beforeSend
回调中“停用”您的触发器,并在success
(或complete
)回调中“启用”它。
$.ajax({
url: "/example",
beforeSend: function(){
#disable trigger
},
complete: function(){
#enable trigger
}
})
但我认为这是一种黑客行为:)
答案 2 :(得分:0)
您的服务器应该跟踪客户端活动,以推断出ajax调用的执行是“逻辑”还是“假”。这可以通过sesions(不推荐)完成,因为也可以伪造(取决于某些因素),或直接在db
答案 3 :(得分:0)
总的来说,我不太愿意发布安全建议,但由于这只是为了增加应用程序中的业力,我会试一试。
使用HMAC摘要怎么样?您需要为客户端登录应用程序时生成密钥,客户端在增加业力时需要发送三位数据:
服务器然后在上面的(1)中查找用户名的密钥,并将加载密钥的HMAC摘要与用户名的串联与上面(3)中提供的HMAC摘要进行比较。
你可以直接拒绝(1)和(2)中的用户名相等比较的情况 - 这将阻止用户增加他们自己的业力。
您还可以拒绝摘要不匹配的情况 - 这将捕获用户试图欺骗业力增量请求的情况。
如果您在登录时共享的密钥被截获,则其他用户可能会使用该密钥来生成虚假的业力增量。
您应该能够找到Ruby和JavaScript的HMAC实现来实现它。
答案 4 :(得分:0)
您可以检查登录用户是否是业力所有者,具体如下:
if current_user.id == karma.user_id
#... throw error
else
karma.save
end