防止在 Javascript 游戏中作弊

IT技术 javascript jquery
2021-02-01 12:21:32

我目前正在使用 JavaScript/JQuery 开发游戏。这是一种简单的砖块破坏类型的游戏,记录分数、级别等。我计划实施一个排行榜,用户可以向其提交最终分数。我看到的唯一问题是用户在大多数浏览器上使用开发人员工具操纵分数。我知道保留服务器端将解决大部分这些问题,但是如果有大量用户,它会因请求而严重打击我的服务器。Cookies - 轻松更改客户端。老实说,我不符合促进公平游戏的逻辑想法,因为总是有人试图作弊/成为排行榜的首位。话虽如此,在不让他们更改分数的情况下,有什么有效的方法可以跟踪用户的分数?

6个回答

使页面提交完整的游戏回放,而不仅仅是最终得分。给定随机种子和用户输入的逐帧记录,您的服务器应该能够模拟和重建游戏并验证分数。

显然,重播也可以伪造,但它需要大量的工作(实际上是玩游戏并获得好分数,尽管 AI 辅助、减速和其他客户端黑客的不公平优势),工具辅助分数应该应该在排行榜上。

这是最有效的解决方案,但不是最简单的。
2021-03-18 12:21:32

通过创建一个只能在服务器端计算的方程来混淆他们的分数。

编辑:RobG 是正确的,因为它需要在客户端进行计算。

当 Angry Birds 游戏在 chrome 上启动时,我入侵了它:

http://wesbos.com/all-levels-html5-angry-birds/

然而,他们已经对代码进行了如此多的混淆,以至于无法弄清楚哪个函数计算了哈希值。

代码在客户端运行,所以无论发生什么编码都在客户端上并且可以被欺骗。不同的方法只会使其或多或少变得困难。
2021-03-23 12:21:32
@RobG 对于益智游戏,有机会使欺骗分数与游戏本身一样困难。
2021-03-27 12:21:32

你不能保证不作弊,这是不可能的。服务器响应请求,就是这样。它不知道客户端上正在运行什么代码,它处于什么类型的用户代理或环境中,甚至不知道它是在运行您的代码还是传真。

您可以采取各种措施来使欺骗变得更加困难,但不能使其成为不可能。这些措施的成本(通常被视为“安全”)通常与被保护资产的value相平衡。

永远不要在客户端上任何东西客户掌握在敌人手中。永远不要忘记这一点。

--网络世界设计法则

我的一个想法是使用游戏计时器。如果用户将分数更改为在经过一段时间后显然不可能的数量,则拒绝记录信息。您可以启动计时器并在服务器端脚本中检查计时器。

现在当然,如果他们仅将分数更改几分,则此检查可能会失败,但是,如果他们仅添加小于影响的数量,那么也许对您来说就不那么重要了?