一尘不染

有什么好的方法可以防止JavaScript多人游戏作弊?

javascript

想象一下具有滚动级别的太空射击游戏。有哪些方法可以防止恶意玩家修改游戏以使其受益?他可以做的很难限制服务器端的事情是自动瞄准,在可见区域外偷看,加速黑客攻击等。

有什么方法可以防止这种情况发生?假定服务器是任何语言,并且客户端通过WebSocket连接。

始终假定代码是100%可入侵的。想办法防止客户完全重写(出于作弊目的)作弊。这些可能是诸如编写安全游戏协议的方法,服务器端检测等。


阅读 272

收藏
2020-05-01

共1个答案

一尘不染

服务器为王。客户端是可入侵的。

您想要做的是Websocket的两件事。

将游戏动作发送到服务器,并从服务器接收游戏状态。

您呈现游戏状态。然后您将输入发送到服务器。

  • 自动瞄准-这很难解决。您必须追求现实。如果用户在10毫秒内击中10次爆头,则您将其踢了。编写巧妙的作弊检测算法。
  • 在可见区域外偷看-通过仅向每个客户发送可见区域来解决
  • 加快骇客入侵-通过正确处理输入来解决。您会收到一个事件,该事件使用户向前移动,并控制用户前进的速度。

你可以 解决由涅槃代码这些问题。客户端上的代码 用于处理输入和显示输出。 所有 逻辑都必须在服务器上完成。

您只需要编写服务器端 验证 。唯一的问题是,由于复杂性,游戏输入要比表单输入更难于验证。您要做的就是确保表单安全完全相同。

不过,您必须非常小心“输入有效”检测。您不想踢/禁制高技能的球员。很难在僵尸程序检测过于宽松与僵尸程序检测之间达到平衡。总体而言,僵尸程序检测的整个领域非常困难。例如,雷神之锤具有自动瞄准检测功能,该技术可以在当天将合法的玩家踢回去。

至于阻止机器人连接到您的websocket,则直接在多人游戏上设置单独的HTTP或HTTPS验证通道,以提高安全性。使用多个Http / https /
ws通道来验证客户端是否为“正式”客户端,作为某种形式的握手。这将使直接连接到ws更加困难。

例:

想想一个简单的多人游戏。一个基于2D房间的赛车游戏。多达n位用户在平面2D平台游戏者地图上竞争从A到B的竞争。

假设出于争论的目的,您有一个安全的系统,其中在HTTPS通道上进行了复杂的身份验证,因此用户无法直接访问您的websocket通道并被迫通过浏览器。您可能有一个用于身份验证的chrome扩展程序,并强迫用户使用它。这减少了问题域。

您的服务器将发送客户端渲染屏幕所需的所有可视数据。您不能掩盖这些数据。无论您尝试什么,一个愚蠢的黑客都可以拿走您的代码,并在调试器中放慢代码的速度,直到他剩下的只是围绕您的websocket的原始包装。他让你运行整个身份验证,但没有
什么 可以做,以从阻止他这样做,剥出你写任何JavaScript阻止他。您所能实现的一切就是限制足够熟练地访问Websocket的黑客数量。

因此,黑客现在将您的Websocket放在了一个chrome沙箱中。他看到输入。当然,您的比赛路线是动态且唯一生成的。如果您有一定数量的密码,那么黑客可以预先设计最佳的竞赛路线。可以更快地呈现为可视化此地图而发送的数据,然后可以与人与您的游戏进行人机交互,并且可以计算出赢得赛车游戏的最佳举动并将其发送到服务器。

如果您想禁止对您的地图数据反应过快的玩家并称其为机器人,那么黑客会对此进行调整并增加延迟。如果您尝试禁止玩得过分完美的玩家,那么黑客会对此进行调整,并使用随机数将其玩得不那么完美。如果在地图中放置只有算法机器人属于的陷阱,则可以通过反复试验或机器学习算法来了解它们,从而避免它们。您无法采取任何措施确保绝对安全。

您只有 一个
选择可以绝对避免黑客入侵。那就是建立自己的浏览器,它不会被黑客入侵。在浏览器中构建安全机制。不允许用户在运行时实时编辑JavaScript。

2020-05-01