假设我正在使用JavaScript和<canvas>制作一个HTML5游戏,变量存储在DOM中,如level、exp、current_map等。
显然,可以使用Firebug在客户端对它们进行编辑。我必须做什么才能最大限度地提高安全性,这样就很难编辑(和作弊)了?
发布于 2012-06-06 08:31:34
如果您希望获得合理的安全性,请不要将变量存储在DOM中。即使混淆了JavaScript,也很容易对其进行逆向工程。这就击败了任何本地加密机制。
在服务器端存储关键变量,并使用https来最大限度地提高安全性。即便如此,客户端代码(JavaScript)仍然很容易受到黑客攻击。
发布于 2012-06-06 08:30:44
您可以使用Object.freeze或polyfill或框架为您执行隐藏。
查看http://netjs.codeplex.com/
您也可以选择实现某种类型的签名系统,但没有什么是真正不可攻破的。例如,使用Object.freeze或Object.watch锁定的对象仍然可以在内存中手动修改。
你到底想要达到什么目的?
你可以做的是发送一个游戏矩阵的表示,或者游戏本身,或者一个特殊的散列,或者两者的组合,并在服务器上计分……使得用户不仅必须修改分数,而且必须正确地修改游戏的状态。
发布于 2012-06-06 08:54:23
客户端中的任何内容都可以修改。这是因为在MMORPG中,角色的数据在服务器上,所以玩家不能使用任何内存工具,十六进制编辑器等破解他们的角色(他们实际上“可以”,但因为服务器保存角色数据的正确版本是无用的)。
一个很好的例子是暗黑破坏神2:你实际上有两个不同的角色:一个是单人游戏(和其他玩家一起玩网络游戏,其中一个是服务器),另一个是Battle.net。在第一种情况下,人们可以“黑”出角色的等级和点数,只需用十六进制编辑器编辑内存或字符文件即可。但对于你在Battle.net上使用的角色来说,这是不可能的。
另一个简单的例子是一个测验,你有有限的时间来回答。如果你在客户端处理所有事情,玩家可以修改它并修改运行时间,总是获得最好的分数:所以你需要将时间戳存储在服务器上,并在获得答案时使用该值作为比较。
总而言之,无论是JavaScript、C++还是Assembly都无关紧要:规则始终是“不依赖于客户端”。如果你需要游戏数据的安全性,你必须使用客户端无法访问的东西:服务器。
https://stackoverflow.com/questions/10906813
复制相似问题