繁体   English   中英

Nodejs安全问题客户端发送请求

[英]Nodejs Security issue client sending request

我正在创建一个浏览器游戏,我知道浏览器并不安全,但我想知道是否有任何解决我的问题的方法。

玩家杀死怪物,平台会向我的后端发送一个 ID,如下所示:

Axios({
   url: this.server + "reward",
   headers: { token: "foo123", charToken: "bar123" },
   method: "POST",
   data: {
      id: 10001, // Monster ID
      value: 10 // How many monsters were killed
   },
});

问题是,我认为无法阻止用户向服务器发送随机请求,说他实际上在一秒钟内完成了这个级别 300 次并获得了 300 倍的奖励物品/exp。

我想过在发送这个reward请求之前请求一个令牌,但这只会让它变得更难并且并没有真正解决任何问题。

您当前的设计

就目前而言,您在此处暗示的设计将无法减轻您对游戏重放攻击的担忧。 考虑这一点的一种有用方法是将其置于“对话式”HTTP 请求/响应范例的上下文中。 目前,您允许的内容类似于:

  • 您的客户告诉您的服务器,“嘿,我赢得了这个奖励!”
  • 您的服务器无法验证这一点,因此回复:“太好了。我已将奖励添加到您的帐户中。”

正如您猜到的那样,这种范式并不能提供非常多的保护,即使是稍微有点动机的攻击者。


目标设计

您的设计应该执行的内容更类似于以下内容:

  • 您的客户应该只能服务器请求某些东西。 (“我选择攻击#123怪物,结果如何?”)
  • 您的服务器应该使用与该请求结果相关的信息来响应该请求。
    • “你不在那个敌人的范围内;你不能攻击他们。”
    • “那个敌人已经被你出动了。”
    • “那个敌人之前已经被其他玩家出动了。”
    • “当你与另一个敌人战斗时,你不能攻击另一个敌人。”
    • “你打偏了,敌人还有100hp。敌人反击打你,你现在有90hp。”
    • “你击中了敌人,现在敌人有1hp。敌人反击打偏了,你还有100hp。”
    • “你击中了敌人,敌人现在血量为0。你已经获得了5个金币作为奖励。”

在这种设计中,您的服务器将成为所有这些信息的看门人,尤其是攻击者试图修改的数据。 您的服务器不会隐含地相信客户端没有被修改,而是自己计算所有这些,并在将这些计算结果记录在数据库或其他存储介质中后简单地将这些计算结果发送回客户端以供显示。

供您考虑的其他项目

  1. 顺序标识符

    虽然您的服务器可能仍会协调所有这些操作并计算所述操作本身的结果,但任何有充分动机的攻击者仍有可能找到利用您的后端的方法,因为您已使用可预测递增的值来识别您的后端实体。 对端点的少量研究以及简短的脚本仍然可以成功地产生意想不到的游戏内财富。

    在创建您希望玩家无法枚举的实体时(阅读:可能是所有实体),您可以使用类似于UUID的东西来生成难以预测的唯一标识符。 你的敌人现在在你的应用程序内部被称为5e03e6b9-1ec2-45f6-927d-794e13d9fa8231e95709-2187-4b02-a521-23b874e10a03 ,而不是一个敌人是#3130,下一个是#3131。 虽然根据数学定义,这些并不是可靠的密码安全,但这使得猜测标识符本身比顺序整数困难几个数量级。

    我通常允许我的数据库为我创建的每个实体自动生成 UUID,因此我不必在后端实现中考虑它; 开箱即用的支持将取决于您选择的 RDBMS。 作为 SQL 服务器中的示例,您将id字段设置为类型UNIQUEIDENTIFIER并具有默认值NEWID()

    如果您出于任何原因在 Node.js(如您已标记)中选择生成这些,则uuidjs/uuid类的东西可以为您生成这些。

  2. 速率限制

    您在问题中没有提到任何有关它的内容(无论您是否已经使用过它),但您确实应该为您的终端用户实施一个对您的游戏来说合理的速率限制。 您的用户JoeHacker可以在一秒钟内攻击 15 次真的有道理吗? 不,可能不是。

    这将根据您运行的任何后端服务器而有所不同。 对于基于 Express 的服务器,包括恰当命名express-rate-limit在内的几个包将以相对简单但有效的方式完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM