Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止用户';它从控制台执行JavaScript_Javascript_Html_Node.js_Socket.io - Fatal编程技术网

停止用户';它从控制台执行JavaScript

停止用户';它从控制台执行JavaScript,javascript,html,node.js,socket.io,Javascript,Html,Node.js,Socket.io,我一直在用HTML5技术制作一款小型多人游戏。我使用Node.js和Socket.IO来管理服务器端业务 我的问题在于,用户能够通过Chrome控制台(以及其他各种控制台)输入自己的JavaScript。例如,用户可以在控制台中输入: socket.emit("new player", {user: username, x: localPlayer.getX(), y: localPlayer.getY()}); 这将为游戏添加一个新玩家。我应该怎么做才能阻止这一切?有没有一种方法可以捕获这些

我一直在用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";
谢谢, 乔尔

你不能那样做。 你永远不能相信来自客户的任何东西。
即使您可能会以某种方式从您的页面影响控制台,攻击者也可以编写自己的web浏览器(阅读:fork Chromium)并绕过您的限制。
或者,攻击者可以在根本不使用任何浏览器的情况下手工处理HTTP请求

相反,您需要验证服务器上的所有内容。

每当任何客户端执行某项操作时,服务器都需要检查该客户端是否确实被允许执行该操作。

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

  • 混淆javascript代码
  • 在使用密钥发送请求之前,请使用加密方法将所有请求加密到服务器(使密钥难以找到)
  • 在服务器端使用与javascript客户端相同的加密方法和密钥解密您的请求
    我们不相信来自客户端的东西的意思是,在创建表单时,您所做的就是这样。您通常检查post方法、会话,这是一个与您发送的有意义数据无关的唯一标记,通常是在服务器端创建的隐藏文本输入,并在提交表单时进行检查。搜索验证和清理表单。除此之外,您还应该为发送的数据加上文字,这样就不可能使用chrome或firebug上的“网络”选项卡,甚至使用适当的流量分析器来重建结构。

    您不能这样做。你永远不能相信任何来自客户的东西。您需要验证服务器上的所有内容。@SLaks我想用户是在问如何区分通过自己的脚本发送到服务器的请求和由某人写入控制台的脚本。@Asad:没错。那是完全不可能的。@SLaks那么你将如何纠正这个问题?你能详细说明一下我将如何在服务器上做所有事情吗?服务器如何知道客户端何时通过控制台输入了JavaScript命令?@jskidd3:关键是服务器根本不可能知道这一点\因此,也许在这里最好的做法是学习一种新的游戏语言:Pit不取决于您使用的语言。在客户端运行的所有东西都会受到“黑客攻击”。Javascript/html是最简单的,因为它甚至没有编译。这是不可能防止的。虽然你可以降低风险。一种方法是混淆javascript代码(使其难以阅读)。这会让黑客泄气,也会让黑客更难入侵,但我重复一遍,如果他们真的想阻止他们,那是不可能的。@jskidd3:你的服务器最终会处理你的游戏(至少我希望如此),客户端会做一些事情(比如移动),服务器会收到命令并更新数据库(或者任何你拥有的永久存储)。当您进行更新时,服务器需要确保玩家所做的移动是有效的(即仅移动一个区块,而不是移动到地图的另一侧)。这就是所谓的验证,您需要确保您收到的命令是有效的。对于来自客户机的任何类型的输入,都需要执行此过程。不要盲目相信客户所说的任何话。这些都不能解决客户根本不安全的问题。必须使用服务器端逻辑进行验证;其他的都是烟雾和镜子。是的,这是错误的。有一种方法可以防止黑客攻击,并通过服务器端验证进行攻击。如何在服务器端验证呢?:socket.emit(“新播放器”{user:username,x:localPlayer.getX(),y:localPlayer.getY()});您可以在服务器端检测异常移动,但在一天结束时,您无法阻止客户端发出虚假请求,除非您在客户端限制您的游戏(例如,一次允许一个插槽移动,但这不能应用于所有游戏)。正如我在回答中所写,您可以验证它。只需在每条消息中发送一个令牌,并在服务器端进行检查。例如,当客户端首次登录时,您将创建一个随机令牌,该令牌将在应用程序启动时传递给客户端。您发送的每一条消息都应该附加该标记,只需确保您对其进行了加密,这样就没有人知道您的对象的结构以及明显的标记值。只需在服务器端验证客户端发送的令牌,您就知道是否可以信任它it@Dslayer-那也不行。OP担心一个聪明的用户在javascript控制台造成的威胁。该用户可以调用加密例程(如果是客户端的话)并制作一个简单的消息。如果加密是在服务器上进行的,那么使用令牌发送假消息就更容易了。您提供的方法可以防止第三方窃听伪造消息,而不是合法的最终用户/骗子。