【问题标题】:html 5 games: can i secure the code somehow so the game itself won't be changed while playing?html 5 游戏:我可以以某种方式保护代码,这样游戏本身就不会在玩的时候被改变吗?
【发布时间】:2010-08-02 10:57:53
【问题描述】:

据我所知,这确实是不可能的,但我只是想在我转向 Flash 之前确定一下。

我能否让 html5 游戏足够安全,让人们在玩游戏时无法更改分数和其他变量?

谢谢!

【问题讨论】:

  • (可能)与stackoverflow.com/questions/2978976/… 重复。请不要因为“默默无闻的安全性”而转向 Flash。 Flash 游戏可以很容易或更容易作弊。
  • 您希望 Flash 如何防止作弊者提交虚假分数?
  • 是的,我想你是对的。 flash 和 html 游戏都需要在服务器上有一个强大的游戏引擎,它可以实际接收您按下的所有动作和按钮位置,并且服务器应该将分数发送给用户,而不是相反。
  • 他们不需要接收每个按钮按下,他们只需要接收客户报告的状态并验证他们声称处于的状态是否合法。 E.g. 他们并没有试图声称他们的生命值从 50 变为 5000。

标签: html


【解决方案1】:

没有“取决于”,对您问题的直接回答是“不”,我认为我的其他回答者只是把水弄混了。

您不能信任客户。对于任何语言,无论您是编写程序集还是 HTML 或 Flash,您都不能信任客户端。无论您对代码进行了多少混淆处理等,都可以并且弄清楚(而且通常比您想象的要快)。

到处都强调这一点,但人们一直对此感到厌烦。在线游戏被“快速破解”是因为它们不检查玩家的速度,或者因为它们没有验证玩家是否确实拥有他们正在尝试做某事的物品,或者蹩脚的小闪光,所以它们会重复物品游戏的得分为 9999999,因为只需使用像 Tamper Data(一个 Firefox 插件)这样的简单工具来更改发送到服务器的得分。

您不能信任客户端,无论是 HTML5 还是 Flash。

如果是单人游戏,让玩家作弊。那是他们的决定。如果是多人游戏,服务器会验证游戏的每一步,并丢弃任何超出规则的内容。如果是他的分数,请将游戏重播发送到服务器并分析它是否存在任何作弊行为,而不是仅发送数字分数。

【讨论】:

    【解决方案2】:

    因为您的用户可以看到所有源代码,所以这是一个相当复杂的问题。 他们可以在运行时轻松更改任何函数或变量,而您的脚本并不知道。 即使使用复杂的签名函数来验证结果。

    我很抱歉,但我认为科林斯的方式也行不通。我可以更改任何输入以使服务器做任何我想做的事情。

    也许通过服务器对分数的持续监控将能够检测到任何不可能的变化。仍然有人在“可能的”结果领域作弊不会被抓到。

    最后我想说的是,你只能让作弊变得相当困难,但对于有一点技巧的人来说并非不可能。

    不要将它用于任何你可以通过得分最高来赢得某些东西的游戏。

    因为这件事对人们来说似乎相当令人费解:

    flash 提供已编译的 swf 文件,不能(从 flash 9 开始)反编译为有用的.smth 所以你可以把一个秘密放在那里,你可以用它来签署分数。 即发送分数和score+secretkey的md5。所以服务器(也知道密钥,可以检查它)。 此外,flash 变量不是那么容易修改(您必须在 ram 中找到它们并在那里更改它们,这是一项非常复杂的任务),而 javascript vars 可以使用例如 webkit 开发工具轻松编辑

    更新

    其实我纠正了自己 => 所有的 swfs 都可以反编译 这只是给我们留下了代码混淆和“加密”

    我猜这个世界毕竟是个糟糕的地方;)

    【讨论】:

    • btw flash 可以编译,因此用户不能“查看”任何“秘密”签名函数。不,我不是在谈论旧的 swf 反编译器的东西。 flash 10 不会反编译成任何有用的东西
    • 我一直和你在一起,直到“不要将它用于任何你可以通过得分最高来赢得某些东西的游戏”。这不利于 Flash 和大多数其他网络技术。完全有可能“通过一点技巧”拦截和更改返回服务器的数据。
    • 是的,但是您可以对发送到服务器的分数进行加密签名,并使用用户不知道的秘密。即 (score+secretkey) 的 md5 以及分数。在 flash 中,用户将无法反编译 swf(因为 flash 9 左右),而在 js 中,用户只能查找它
    • @arjantop 在阅读了一段时间的最新反编译器之后......似乎所有的 swfs 都可以在今天被反编译......在过去可不是这样 ;) 所以这只是给我们留下了旧的混淆和“加密”
    • -1 此答案不提供解决方案或增强对问题的理解。
    【解决方案3】:

    取决于您的游戏编码方式,但如果所有逻辑都发送到客户端并且只返回分数,那么您就没有希望了。只有通过返回输入并在服务器端计算分数,您才能尝试阻止用户提交他们希望的任何分数。

    不要忘记,根据定义,用户必须更改他们的分数,否则它永远不会超过 0...

    【讨论】:

    • 这个答案同样适用于 HTML5、Flash 或任何其他编写游戏的方式。
    【解决方案4】:

    一个想法!!

    您可以使用 Knockout.js 将您的分数和其他变量修改为可观察的属性。 步骤是:

    1. 为您的游戏创建 ViewModal
    2. 为所有变量创建可观察的属性(即分数)
    3. 您需要将分数存储在缓存中,以便在新分数到达时访问它。
    4. 将自定义订阅者附加到这些属性并编写逻辑来检查分数是否应该一次更新一个“单位”(我的意思是单位,你想如何一次更新用户的分数)。最后分数与当前分数之间的差异不应超过“UNIT”
    5. 更新 scoe 作为 ViewModal.Score(newScore); //这将向可观察属性的订阅者触发一个事件。!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2014-01-30
      • 2019-02-03
      相关资源
      最近更新 更多