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

Preventing client side abuse/cheating of repeating Ajax call that rewards users

本文关键字:用户 调用 Ajax 客户端 欺骗      更新时间:2023-09-26

我正在制定一个硬币计划,以奖励会员在我的网站上。我的程序制作两个随机数并进行比较,如果它们相同,您将获得一枚硬币。我遇到的问题是有人可以进入控制台并获得"免费"硬币。他们还可以通过打开更多标签或制作一个程序来生成更多硬币来作弊,我现在正试图阻止。我正在考虑将其从 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将导致他们获得他们想要的所有硬币。

我应该只包含一个包含变量吗?但是,我将如何显示具有当前硬币数量的成功消息。此外,此代码位于每 15 毫秒重复一次的 setInterval 函数中。

有多种

方法可以做到这一点,但也许最简单的方法是进入服务器端代码 - 当请求进来时,您检查上次硬币更新的时间,如果没有,则运行硬币代码并在其会话中保存此操作的时间。如果有存储的时间,请确保它超出了所需的时间。如果是,请继续硬币更新。如果不是,只需使用 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,以便与服务器的连接正在进行中。无论哪种方式,逻辑都可以具有可比性。

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