服务器为王。客户端是可被黑客攻击的。
你想要用你的 websocket 做两件事。
将游戏动作发送到服务器并从服务器接收游戏状态。
您渲染游戏状态。然后您将输入发送到服务器。
- 自动瞄准——这个问题很难解决。你必须追求现实。如果一个用户在 10 毫秒内爆头 10 次,那么你就会踢他。编写一个聪明的作弊检测算法。
- 窥视可见区域之外 - 通过仅将可见区域发送给每个客户端来解决
- 超速黑客攻击 - 通过正确处理输入来解决。您收到一个用户向前移动的事件,您可以控制他前进的速度。
You can NOT通过缩小代码来解决这些问题。客户端的代码是ONLY在那里处理输入和显示输出。ALL逻辑必须在服务器上完成。
你只需要编写服务器端验证。唯一的问题是,由于复杂性,游戏输入比表单输入更难验证。这与确保表单安全所需执行的操作完全相同。
不过,您需要非常小心“输入有效”检测。您不想将高技能玩家踢出/禁止参加您的游戏。机器人检测过于宽松和机器人检测过于严格之间很难达到平衡。整个机器人检测领域总体来说非常困难。例如,《雷神之锤》有一个自动目标检测功能,可以将技术熟练的玩家踢回过去。
至于阻止机器人连接到您的 websocket,请直接在多人游戏上设置单独的 HTTP 或 HTTPS 验证通道以增加安全性。使用多个 Http/https/ws 通道来验证客户端是否为“官方”,充当某种形式的握手。这将使直接连接到 ws 变得更加困难。
Example:
想象一个简单的多人游戏。一款基于 2D 房间的赛车游戏。最多 n 个用户可以在平坦的 2D 平台游戏地图上竞相从 A 地到达 B 地。
为了便于论证,假设您有一个万无一失的系统,其中通过 HTTPS 通道进行复杂的身份验证,因此用户无法直接访问您的 websocket 通道,而被迫通过浏览器。您可能有一个处理身份验证的 Chrome 扩展程序,并且强制用户使用它。这减少了问题域。
您的服务器将发送客户端渲染屏幕所需的所有视觉数据。您无法掩盖这些数据。无论你尝试什么,有潜质的黑客都可以获取你的代码,并在调试器中减慢它的速度,一边编辑一边进行,直到他剩下的只是你的 websocket 的原始包装器。他让你运行整个身份验证,但有nothing你可以阻止他删除你编写的任何 JavaScript,从而阻止他这样做。您所能实现的就是限制足够熟练的黑客访问您的 websocket 的数量。
因此,黑客现在将您的 websocket 放在 chrome 沙箱中。他看到了输入。当然,您的赛道是动态且独特地生成的。如果你有一定数量的黑客,那么黑客就可以预先设计最佳的比赛路线。您发送的用于可视化此地图的数据可以比人类与游戏的交互更快地呈现,并且可以计算赢得赛车游戏的最佳动作并将其发送到您的服务器。
如果你试图禁止对你的地图数据反应太快的玩家并称他们为机器人,那么黑客会对此进行调整并增加延迟。如果您尝试禁止玩得太完美的玩家,那么黑客会调整这一点,并使用随机数玩得不太完美。如果您在地图中放置了只有算法机器人才会落入的陷阱,那么可以通过尝试和错误或机器学习算法来了解它们,从而避免它们。您无法采取任何措施来确保绝对安全。
你只有ONE绝对避免黑客攻击的选项。那就是构建你自己的、无法被黑客攻击的浏览器。将安全机制构建到浏览器中。不允许用户在运行时实时编辑 JavaScript。