防止客户端滥用/欺骗重复的Ajax调用以奖励用户

安德鲁

我正在研究一个硬币计划,以奖励那些在我网站上的成员。我编写的程序将两个随机数进行比较,如果它们相同,则会得到一个硬币。我的问题是有人可以进入控制台并获得“免费”硬币。他们还可以通过打开更多标签或制作程序以立即生成更多金币来作弊,而我正试图停止这种作法。我正在考虑将其从js转换为php以停止作弊(大部分情况下),但我不知道该怎么做。有问题的代码是:

$.ajax({
    type: 'post',
    url: '/version2.0/coin/coins.php',
    data: {Cid : cs, mode : 'updateCoins'},
    success: function (msg) {
        window.msg=msg;
    }});

控制台的代码是围绕它的循环。在上面的代码中,“ cs”是成员的ID,因此通过将其替换为其ID将导致他们获得所需的所有硬币。

我是否应该在其上面包含一个带有变量的包含物?但是,然后我将如何显示包含当前硬币数量的成功消息。另外,此代码位于setInterval函数中,该函数每15毫秒重复一次。

m59

您可以通过多种方式执行此操作,但最简单的方法可能是输入服务器端代码-收到请求时,您检查上次硬币更新的时间,如果没有更新,则运行您的硬币代码并在他们的会话中节省此操作的时间。如果有存储的时间,请确保它超出了期望的时间。如果是,请继续进行硬币更新。如果不是,则只需以403或其他失败代码作为响应。

用伪代码:

if (!$userSession['lastCoinTime'] || $currentTime + $delay > $userSession['lastCoinTime']) {
  // coin stuff
  $userSession['lastCoinTime'] = // new time
} else {
  // don't give them a chance at coin, respond however you want
}

但是,由于您正在谈论每15毫秒执行一次此检查,因此我将使用websockets以便与服务器的连接正在进行。无论哪种方式,逻辑都可以比较。

万一对此有任何不确定性,请绝对在服务器上执行所有硬币逻辑。您永远无法相信用户输入的有效数据。根据身份验证的设置方式,您所能信任的最多的就是只有他们才会知道的某种秘密代码,这只会让您知道他们是谁,这是一种技术用于代替持久会话。除非您这样做,否则您将依靠会话来了解用户是谁-绝对也不要让他们告诉您!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章