【问题标题】:JavaScript Games and SecurityJavaScript 游戏和安全
【发布时间】:2012-06-06 00:28:16
【问题描述】:

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

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

【问题讨论】:

    标签: javascript security logic


    【解决方案1】:

    如果您希望获得合理的安全级别,请不要将变量存储在 DOM 中。 JavaScript,即使被混淆,也可以很容易地被逆向工程。这会破坏任何本地加密机制。

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

    【讨论】:

    • 让你所有的朋友投票,但这仍然不能改变你不完全正确的事实:P
    • @Jay:我提供的替代方案是在服务器端存储游戏变量。客户端存储游戏变量的游戏特别容易受到黑客攻击。我向你保证,魔兽世界不会因为这个原因(以及其他原因)在客户端存储关键游戏变量。
    • 即使是缓存?问题是关于评分和其他细节,而不仅仅是最终存储位置......
    • @Jay:如果你认为你也投反对票,请捍卫你的反对意见,但我认为你在夸大其词。
    • 你有权发表你的意见......只是不正确:P
    【解决方案2】:

    您可以使用 Object.freeze 或 polyfill 或为您进行隐藏的框架。

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

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

    你到底想完成什么?

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

    【讨论】:

      【解决方案3】:

      服务器端游戏逻辑

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

      【讨论】:

        【解决方案4】:

        可以修改客户端中的任何内容。那是因为在 MMORPG 中角色的数据存在于服务器上,所以玩家不能使用任何记忆工具、十六进制编辑器等来破解他们的角色(他们实际上“可以”,但因为服务器保留了角色数据的正确版本没用)。

        一个很好的例子是暗黑破坏神 2:你实际上有两个不同的角色:一个用于单人游戏(和网络与其他玩家一起玩,其中一个是服务器),一个用于战网。在第一种情况下,人们可以“破解”角色的关卡,并指出只是在运行中编辑内存或使用十六进制编辑器编辑角色文件。但这对于你在战网上使用的角色是不可能的。

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

        总而言之,不管是 JavaScript、C++ 还是汇编语言:规则始终是“不要依赖客户端”。如果您需要游戏数据的安全性,则必须使用客户端无法访问的东西:服务器。

        【讨论】:

          猜你喜欢
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-16
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 2015-02-18
          相关资源
          最近更新 更多