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

2023-11-27

想象一个带有滚动关卡的太空射击游戏。有哪些方法可以防止恶意玩家修改游戏以谋取私利?他可以做的服务器端难以限制的事情是自动瞄准、在可见区域外窥视、加速黑客攻击和其他事情。

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

始终假设代码 100% 可破解。想办法防止客户端完全重写(为了作弊的目的)作弊。这些可以是编写安全游戏协议的方法、服务器端检测等。


服务器为王。客户端是可被黑客攻击的。

你想要用你的 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有哪些好的方法可以防止 JavaScript 多人游戏作弊? 的相关文章

随机推荐

  • 如何在 Spring Boot 应用程序启动时启动 H2 TCP 服务器?

    当将应用程序作为 Spring Boot 应用程序运行时 我可以通过将以下行添加到 SpringBootServletInitializer main 方法中来启动 H2 TCP 服务器 文件中的数据库 SpringBootApplicat
  • Android使椭圆形背景可绘制并带有聊天角

    我知道如何创建椭圆形背景 我将此可绘制元素添加到relativelayout背景
  • 以兼容级别 80 运行 SQL Server 2005 数据库是否会对性能产生负面影响?

    我们的软件必须能够在 SQL Server 2000 和 2005 上运行 为了简化开发 我们以兼容级别 80 运行 SQL Server 2005 数据库 但是 在某些情况下 SQL 2005 上的数据库性能似乎比 SQL 2000 上慢
  • 路由在 Symfony 3.4 中不起作用

    我使用以下命令创建了一个新的 Symfony 3 4 项目 composer create project symfony skeleton my project 之后我添加了以下组件 composer require twig compo
  • 如何在U-Boot和Linux内核中添加自定义的ATAG变量?

    我要添加定制atagU Boot 和 Linux 内核中的变量 我怎样才能做到这一点 有没有什么程序可以添加ATAG变量在U Boot and Linux 最新的 Linux 内核正试图废弃ATAGS with 设备树 但是 那setup
  • 如何像 Instagram 和 Vine 一样在 ListView 中播放视频?

    我是 Android 开发新手 我正在尝试在列表视图中播放多个视频 目前 每个列表视图行项目都是一个视频视图 这种方法不起作用 因为当我开始滚动时 VideoViews 表现异常 我研究过here here here并发现VideoView
  • 获取绘图的只读属性名称列表

    如果要通过属性结构复制绘图 则需要过滤掉只读属性 例如 Annotation BeingDeleted Parent Type 有没有办法获取对象的只读属性列表 该问题源自一个相关问题 如何从绘图处理程序中绘图 我开始研究上一个问题 尝试动
  • 按行比较矩阵与向量中的元素

    我想将矩阵的值与相应的向量进行比较 比较应该按行进行 矩阵示例 ret TLT VTI 1995 01 20 0 005649718 0 004461441 1995 01 23 0 002840909 0 002560820 1995 0
  • 如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?

    我正在运行我的 Rails 应用程序AWS 弹性豆茎平台 它运行具有 Auto Scaling 和 Elastic Load Balancing 的单个 EC2 实例 我想知道怎么跑resque delayed job or sidekic
  • mysql联合不同列数

    我知道联合查询必须具有相同数量的列 我正在尝试从表中获取结果comments以及表中的结果strings 它有多个连接 我如何正确地做到这一点 我还没有测试过 因为我知道我会收到不同数量的列的错误 这是我试图合并的两个查询 查询1 字符串
  • 如何使用TreeStore或TreeEditor组件更新数据?

    我使用 tree Panel 和 TreeStore 组件 我使用 JSON 文件来存储我的数据 但我想知道如何使用 TreeStore 升级我的数据 我解释我的问题 我的页面上有 2 个组件 Tree Panel用TreeStore和Pa
  • LinkedIn 的访问令牌更新流程可以在服务器上执行吗?

    在 Facebook 的 Graph API 中 一旦我们初步验证了用户身份 我们就可以直接与 API 从服务器 进行交互 以获得长期存在的页面访问令牌 这个长期存在的页面访问令牌永远不会过期 https developers facebo
  • 在 python opencv 中为像素着色

    我需要为图像中的像素着色 我使用opencv和python 我试过img x y 255 255 255 给一个上色pixel x y 但它不会工作 这其中是否有什么错误呢 你能建议任何方法吗 提前致谢 img x y 255 255 25
  • IF EXISTS UPDATE ELSE INSERT 语法错误

    我正在使用由我的 ISP 托管的 MySQL 5 1 这是我的查询 mysql query IF EXISTS SELECT FROM licensing active WHERE title 1 title 1 THEN BEGIN UP
  • 从内容页设置母版页上的属性值

    每次加载页面时 我都需要将数据传递给母版页中的变量 我在每个内容页面上设置了一个RequiredRoles 字符串 定义了访问该页面所需的角色 在我的母版页上 我有一种方法可以获取该数组 并检查当前用户是否属于这些角色中的一个或多个 我将如
  • 方法重载装饰器

    我正在尝试编写一个为 python 提供方法重载功能的装饰器 类似于中提到的PEP 3124 我编写的装饰器非常适合常规函数 但我无法让它适用于类中的方法 这是装饰器 class Overload object def init self
  • UI Router Extras 破坏了我的单元测试并出现意外结果错误?

    问题 安装 ui router extras 不是普通的 ui router 时 为什么我的测试失败 我该如何使用ui router extras我的测试仍然通过吗 如果你想快速安装 请使用 yeoman angular fullstack
  • 如何向单个客户端而不是所有客户端发送命令?

    我正在用 Indy 10 编写一个简单的客户端 服务器聊天程序 我的服务器 idtcpserver 向客户端发送一条命令 客户端应答 但是当连接多个客户端并且服务器发送命令时 all连接的客户端向服务器发送数据 如何向指定客户端而非全部客户
  • 限制 API 调用。仅允许我的移动应用程序

    我想要我的网络服务器接受请求起源仅从我的移动应用 由于移动应用程序是客户端应用程序 这意味着用户可以拥有二进制文件并反编译它 或者使用 Fiddler 等工具来解释 API 调用并重建它们 例如 在控制台应用程序中 所以我想要的是一种方法生
  • 有哪些好的方法可以防止 JavaScript 多人游戏作弊?

    想象一个带有滚动关卡的太空射击游戏 有哪些方法可以防止恶意玩家修改游戏以谋取私利 他可以做的服务器端难以限制的事情是自动瞄准 在可见区域外窥视 加速黑客攻击和其他事情 有哪些方法可以防止这种情况发生 假设服务器是任何语言 并且客户端通过 W