JavaScript Games and Security

JavaScript Games and Security

本文关键字:Security and Games JavaScript      更新时间:2023-09-26

假设我正在使用JavaScript和<canvas>制作HTML5游戏,变量存储在DOM中,如levelexpcurrent_map等。

显然,可以使用Firebug在客户端编辑它们。我必须做些什么才能最大限度地提高安全性,所以编辑(和作弊)真的很难?

如果您希望合理的

安全级别,请不要将变量存储在 DOM 中。 JavaScript,即使被混淆,也可以很容易地进行逆向工程。 这破坏了任何本地加密机制。

将关键变量存储在服务器端,并使用 https 最大限度地提高安全性。 即便如此,客户端代码(JavaScript)也很容易受到黑客攻击。

您可以使用

Object.freeze或polyfill或框架来为您进行隐藏。

查看 http://netjs.codeplex.com/

您还可以选择实现某种类型的签名系统,但没有什么是真正坚不可摧的。例如,用Object.freezeObject.watch锁定的对象仍然可以在内存中手动修改。

你到底想完成什么?

您可以做的是发送游戏矩阵或游戏本身的表示或特殊哈希或两者的组合,并在服务器上计算分数......使用户不仅要修改分数,还要正确修改游戏状态。

服务器端游戏逻辑

您需要将敏感数据保留在服务器上,并在浏览器上保留本地副本,仅用于显示目的。然后,对于更改这些值的每个操作,服务器应该是负责验证它们的服务器。例如,如果玩家需要解决一个难题,你永远不应该验证解决方案客户端,而是以表示为字符串的有序片段的哈希值为例,并将其发送到服务器以验证哈希值是否正确。然后增加玩家的 xp/等级并将信息发送回客户端。

客户端中的任何内容都可以修改。这是因为在MMORPG中,角色的数据存在于服务器上,因此玩家无法使用任何内存工具,十六进制编辑器等破解他们的角色(他们实际上"可以",但由于服务器保留正确版本的角色数据是无用的)。

一个

很好的例子是暗黑破坏神2:你实际上有两个不同的角色:一个用于单人游戏(以及与其他玩家一起玩的网络游戏,其中一个是服务器),另一个用于 Battle.net。在第一种情况下,人们可以"破解"角色的等级和点,只需动态编辑内存或使用十六进制编辑器编辑字符文件即可。但是,对于您在 Battle.net 上使用的角色来说,这是不可能的。

另一个简单的例子可能是测验,您的回答时间有限。如果你在客户端处理所有事情,玩家可以破解它并修改经过的时间,并始终获得最佳分数:所以你也需要将时间戳存储在服务器上,并在得到答案时使用该值作为比较。

总而言之,无论是

JavaScript,C++还是Assembly都没有关系:规则始终是"不要依赖客户端"。如果您需要游戏数据的安全性,则必须使用客户端无法访问的东西:服务器。