假设我正在使用 JavaScript 制作 HTML5 游戏,并且<canvas>
变量存储在 DOM 中,例如level
、exp
、current_map
等。
显然,它们可以在客户端使用 Firebug 进行编辑。为了最大限度地提高安全性,我必须做些什么,所以真的很难编辑(和作弊)?
假设我正在使用 JavaScript 制作 HTML5 游戏,并且<canvas>
变量存储在 DOM 中,例如level
、exp
、current_map
等。
显然,它们可以在客户端使用 Firebug 进行编辑。为了最大限度地提高安全性,我必须做些什么,所以真的很难编辑(和作弊)?
如果您希望获得合理的安全级别,请不要将变量存储在 DOM 中。JavaScript,即使被混淆,也可以很容易地被逆向工程。这破坏了任何本地加密机制。
在服务器端存储关键变量并使用 https 来最大限度地提高安全性。即便如此,客户端代码 (JavaScript) 还是很容易受到黑客攻击。
您可以使用Object.freeze
polyfill 或框架为您进行隐藏。
您还可以选择实现某种类型的签名系统,但没有什么是真正难以理解的。例如对象被锁定Object.freeze
或Object.watch
仍然可以在内存中手动修改。
你到底想完成什么?
您可以做的是发送游戏矩阵或游戏本身的表示或特殊哈希或两者的组合并在服务器上计算分数......导致用户不仅必须修改分数,而且正确修改游戏状态。
可以修改客户端中的任何内容。那是因为在 MMORPG 中角色的数据存在于服务器上,所以玩家不能使用任何记忆工具、十六进制编辑器等来破解他们的角色(他们实际上“可以”,但因为服务器保留了角色数据的正确版本没用)。
一个很好的例子是暗黑破坏神 2:你实际上有两个不同的角色:一个用于单人游戏(和网络与其他玩家一起玩,其中一个是服务器),一个用于战网。在第一种情况下,人们可以“破解”角色的关卡,并指出只是在运行中编辑内存或使用十六进制编辑器编辑角色文件。但这对于您在战网上使用的角色是不可能的。
另一个简单的例子可能是一个测验,你只能在有限的时间内回答。如果您在客户端处理所有事情,玩家可以破解它并修改经过的时间并始终获得最佳分数:因此您还需要将时间戳存储在服务器上,并在获得答案时使用该值作为比较。
总而言之,不管是 JavaScript、C++ 还是汇编语言:规则始终是“不要依赖客户端”。如果您需要游戏数据的安全性,则必须使用客户端无法访问的东西:服务器。
服务器端游戏逻辑
您需要将敏感数据保留在服务器上,并将本地副本保留在浏览器上,仅用于显示目的。然后,对于更改这些值的每个操作,服务器应该负责验证它们。例如,如果玩家需要解决一个谜题,您永远不应该验证解决方案客户端,而是将例如表示为字符串的有序棋子的哈希值发送到服务器以验证哈希值是否正确。然后增加玩家的经验/等级并将信息发送回客户端。