【问题标题】:Stop user's executing JavaScript from console停止用户从控制台执行 JavaScript
【发布时间】:2013-05-14 08:10:44
【问题描述】:

我一直在忙于使用 HTML5 技术创建一个小型多人游戏。我使用 Node.js 和 Socket.IO 来管理服务端业务。

我的问题在于用户能够通过 Chrome 控制台(以及我确定的其他各种控制台)输入他们自己的 JavaScript。例如,用户可能会在控制台中输入以下内容:

socket.emit("new player", {user: username, x: localPlayer.getX(), y: localPlayer.getY()});

这会在游戏中添加一个新玩家。我应该停止这种情况的最佳方法是什么?有没有办法可以捕获这些条目并简单地拒绝它们(然后拍打用户的脸)?如果我可以通过更改变量来阻止他们编辑 GUI 之类的东西,那也很好,例如:

gameStatus = "trolled lol troll client-side editing lol";

谢谢, 乔尔

【问题讨论】:

  • 你不能。你永远不能相信来自客户的任何东西。您需要验证服务器上的所有内容。
  • @SLaks 我认为用户在询问如何区分由他的脚本发送到服务器的请求和由某人写入控制台的脚本。
  • @Asad:没错。这是完全不可能的。
  • @SLaks 那么你将如何解决这个问题呢?

标签: javascript html node.js socket.io


【解决方案1】:

我们所说的不信任来自客户端的内容的意思是完全按照您在创建表单时所做的事情。您通常会检查 post 方法、会话、与您发送的有意义数据无关的唯一令牌 - 通常是在服务器端创建并在提交表单时检查的隐藏文本输入。搜索验证和清理表格。最重要的是,您应该为发送的数据加密,这样就无法使用 chrome 或 firebug 上的网络选项卡甚至是适当的流量分析器来重建结构。

【讨论】:

    【解决方案2】:

    正如 SLaks 所指出的,没有办法阻止某人进行黑客攻击,对于 javascript/html 客户端来说更是如此,因为它更容易。正如我在评论中所说,有一些方法可以阻止或使其更难。我正在发布更多建议

    1. 混淆你的javascript代码
    2. 使用加密方法并在使用密钥发送所有请求之前对服务器进行加密(让您很难找到密钥)
    3. 在服务器端使用与 javascript 客户端相同的加密方法和密钥解密您的请求。

    【讨论】:

    • 这些都不能解决客户端根本不安全的问题。您必须使用服务器端逻辑进行验证;其他一切都是烟雾和镜子。
    • 是的,它错了。有一种方法可以防止黑客入侵,并且可以通过服务器端验证来实现。
    • 如何在服务器端验证它?:socket.emit("new player", {u​​ser: username, x: localPlayer.getX(), y: localPlayer.getY()});您可以在服务器端检测到异常移动,但归根结底,您无法阻止客户端发出虚假请求,除非您在客户端限制您的游戏(例如,一次允许一个插槽移动,但这不能适用于所有游戏)。
    • 正如我在回答中所写的,您可以验证它。只需在每条消息中发送一个令牌并在服务器端进行检查。例如,当客户端首次登录时,您创建一个随机令牌,该令牌将在应用启动时传递给客户端。您发送的每条消息都应附加该令牌,只需确保您对其进行加密,这样就没有人知道您的对象的结构以及显然令牌的值。只需在服务器端验证客户端发送的令牌,您就知道您是否可以信任它
    • @Dslayer - 这也行不通。 OP 担心一个聪明的用户在 javascript 控制台上造成的威胁。该用户可以调用加密例程(如果它的客户端)并轻松制作消息。如果在服务器上进行加密,那么使用令牌发送虚假消息就更容易了。您提出的方法可以防止第三者窃听伪造消息,而不是合法的最终用户/作弊者。
    【解决方案3】:

    你不能那样做。

    您永远不能相信来自客户的任何东西。
    即使您可以通过您的页面以某种方式影响控制台,攻击者也可以编写自己的 Web 浏览器(阅读:fork Chromium)并绕过您的限制。
    或者攻击者可以在没有任何浏览器的情况下简单地手工制作 HTTP 请求。

    相反,您需要验证服务器上的所有内容。
    每当任何客户端做某事时,服务器都需要检查该客户端是否真的被允许这样做。

    【讨论】:

    • 您能否详细说明一下我将如何在服务器上做所有事情?服务器如何知道客户端何时通过控制台输入了 JavaScript 命令?
    • @jskidd3:关键是服务器根本不可能知道这一点。 \
    • 所以也许最好的办法就是学习一门新的语言来创建游戏? :P
    • 它不依赖于您使用的语言。在客户端运行的所有内容都受到“黑客攻击”。 Javascript/html 是最简单的之一,因为它甚至没有被编译。这是不可能防止的。虽然你可以降低风险。一种方法是混淆您的 javascript 代码(使之难以阅读)。这会阻止并使其更难破解,但我再说一遍,如果他们真的想要阻止他们是不可能的。
    • @jskidd3:你的服务器最终会处理你的游戏(至少我希望如此),客户端会做一些事情(即移动),服务器接收该命令并更新数据库(或任何你的永久存储有)。当你进行更新时,服务器需要确保玩家所做的移动是有效的(即只移动了一个街区,而不是移动到地图的另一边)。这叫做validation,你要确保你得到的命令是valid。对于来自客户端的任何类型的输入,都需要完成此过程。不要盲目相信客户说的任何话。
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多