【问题标题】:Prevent sending AJAX request with the dev Console?阻止使用开发控制台发送 AJAX 请求?
【发布时间】:2023-01-03 01:48:00
【问题描述】:

我在不使用框架的情况下使用 javascript、html、css 和 PHP 创建了一个记忆游戏,我使用 php 将玩家姓名和分数保存到 MySql 数据库中,我从我的 javascript 获取这些变量并使用它们发送jQuery Ajax 发布请求这就是我的代码的样子:

$("#submitScore").on("click", function() {
  let playerName = $('#playerName').val();
  
  if(isEmptyOrSpaces(playerName)){
    playerName = "Unknown";    
  }
  
  let data = {"player_name": playerName, "score": totalScore};
  $.post("./backend/save_score.php", data, function(){
    fetchHighScores();
    $("#submitScore").prop('disabled', true);
  });
});

一切正常我唯一的问题是任何人都可以发送一个ajax请求使用开发控制台,所以如果有人将此行放入控制台并按回车键

$.post("./backend/save_score.php", {"player_name": "Cheater", "score": 1111111111});

它将被保存到我的数据库中,我确信有一个解决方案,我搜索了 CSRF 攻击,但我没有得到正确的答案我是 Ajax 世界的新手,我怎样才能防止这种行为?我不想使用框架让我的游戏尽可能简单?提前致谢

【问题讨论】:

    标签: javascript php jquery ajax xmlhttprequest


    【解决方案1】:

    你不能。

    您需要做的是改变您的方法,并添加一些服务器端验证。让 JavaScript 向您的服务器发送用户对问题的回答,而不是最终分数。这样服务器就可以检查答案是否正确,服务器会计算分数并返回。这将阻止任何人发送他们自己编造的乐谱。

    【讨论】:

    • 感谢您的回复,所以您的意思是我应该在玩家收到时发送请求正确的一对牌并使用我的 php 计算它们然后计算分数?
    • 是的。或者您可以在最后通过一个请求发送所有答案。由你决定。
    • 其实还是不太对。不要发送卡片正确与否的事实 - 这仍然允许作弊。只需将用户选择的卡片发送给服务器即可。服务器必须决定它们是否正确。
    • 但不可能有人可以用同样的方法发送被操纵的数据吗?
    • 是的,他们可以寄给你两张卡片来测试。如果您需要执行其他规则,则需要考虑服务器如何验证这些规则,例如维护自己的游戏状态副本并检查提交的动作在当前场景中是否有效,诸如此类.基本上你不能相信任何事物客户发给你。始终仔细检查它。
    【解决方案2】:

    简答你不能那样做,改为更改您的后端逻辑,这意味着您的验证应该在您的后端代码中完成

    【讨论】:

      【解决方案3】:

      您无法阻止从 Dev Console 发送 AJAX 请求,但可以使其变得更加困难。例如,您可以将验证码添加到您的页面,如果正确集成,则很难使用机器人发送表单。

      但是,您需要定义可疑请求的外观、可疑模式并根据它们验证请求。

      【讨论】:

      • 我很想知道这个答案需要改进什么。
      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 2016-05-17
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2013-11-03
      • 2021-04-08
      • 2019-06-22
      相关资源
      最近更新 更多