【问题标题】:Securely provide a unique secret code to winner of flash game?安全地向 Flash 游戏的获胜者提供唯一的密码?
【发布时间】:2011-02-15 15:59:34
【问题描述】:

这就是我想做的事情:当玩家赢得游戏(以 flash/actionscript 编码)时,他们会获得一个个性化的密钥,他们可以通过电子邮件将其发送给我以换取奖品。然后我可以使用私有算法验证我的密钥。

我需要对其进行设计,使黑客几乎不可能在不赢得游戏的情况下生成有效的奖品密钥。这甚至可能吗?

我假设任何 SWF 文件基本上都容易被反编译,但我不知道它们到底有多脆弱。也许任何生成有效密钥的算法都可以被黑客访问?

我可以使用 actionscript 3 中的所有方法,以及一个 PHP/MySQL 服务器,并且我控制着托管游戏的服务器。

【问题讨论】:

  • 至少,将您的密钥生成服务器端保留在 PHP 中!
  • 为什么不在用户中奖后立即询问他们的信息并立即处理他们的奖品?
  • @espais,我可以这样做,但是如何通过直接请求 PHP 文件来防止他们在不赢得游戏的情况下请求密钥?
  • @Matt,这可能是一个具有实际价值的现实世界的奖品。什么可以阻止黑客使用脚本提交虚假的奖品声明?
  • 好吧,你假设他们不能一开始就破解你的游戏。我的意思是,不要让“赢家获得奖品”的过程出现在游戏之外,而是在游戏获胜时立即发生,因为那时你知道游戏实际上已经赢了,而赢的人仍然在屏幕上.

标签: php mysql security actionscript cryptography


【解决方案1】:

您真正想做的是安全地确定游戏的获胜者。

这很难,但根据游戏,您可以尝试:

  • 通过服务器持续验证游戏状态(开门、进入房间、地图上的坐标等),尤其是关于时间(坐标之间移动需要多长时间);

  • 提前确定比赛的输赢(例如scratch cards);

  • 向获胜者提问有关游戏的问题(“牛是什么颜色的?”)。

【讨论】:

  • +1 用于向获胜者提问并验证游戏状态。
【解决方案2】:

免责声明:我不使用闪存。

开始游戏时,我会从服务器获得一个唯一的令牌。在他们赢得比赛后,我将使用该唯一令牌生成一个代码并将其显示给用户。然后,您可以根据来自服务器的令牌验证唯一代码。

您可以做的另一件事是在他们玩游戏时逐步“构建”唯一代码。如果他们不玩通关,他们至少必须回溯整个游戏以生成代码。

我想说大多数游戏在某种形式上都容易被反编译,目标是尽量减少损失。如果您要赠送高价值奖品,那么您当然会成为不择手段的人的目标。

【讨论】:

    【解决方案3】:

    将密钥生成保留在服务器端。即使它是一个简单的 md5 哈希,对确切的生成细节保密也很重要。将一些随机字符添加到您生成的任何散列中,这样它就不会看起来像 md5 或 sha1 散列。

    当然,那么问题就变成了“我怎么知道用户真的赢得了比赛”?反编译 .swf 会让有决心的用户发现您发送了“won=1”,然后砰的一声,您会得到一个获胜的密钥代码,此时游戏就结束了,可以这么说。

    让您了解这有多难:

    多年前,有一个网站提供您玩的极简 Flash 游戏并赢取积分以换取奖品。它的编码非常草率,以至于您不得不质疑网站运营商的理智。一些主要缺陷:

    1) 每天进行一次调查。一个有几个选择的问题。他们将问题的分值作为隐藏值放入调查表中。它是通过 GET 提交的。您可以手动构建响应并每天给自己一次 MAX_INT 分,只需在地址栏中执行“response.php?surveyID=XXX&choiceID=YYY&points=4294967295”

    2) 他们相对较快地发现了这一点,并修复了积分漏洞,但由于某种原因取消了每日限制,因此您可以多次提交您的答案(例如)20 分。

    3) 在他们解决了这个问题之后,人们开始着手破解游戏——玩游戏并赢得胜利会给你(比如说)100 分。在这里,他们在发布时更聪明一些,并且没有通过客户端来回传递点值。但是他们忘记验证播放次数,该次数保留在客户端 - 因此您可以在他们的服务器上启动 POST 次数获得 100 分

    4) 在修复该问题并将“游戏次数”计数移至服务器后,人们只是让他们的机器人提交游戏的特定限制,但为网站上的每个游戏提交虚假声明

    5) 在他们开始在游戏中添加检查点后(例如“告诉服务器第 1 级已完成”、“看,他们刚刚完成第 2 级”等),人们只需将检查点消息添加到他们的偷点机器人中即可。

    等等……

    如果您要开始申领任何价值的奖品,请注意,您可能会在短期内多次尝试将预算吸干。

    【讨论】:

      【解决方案4】:

      简短的回答是:

      你不能。

      长答案:

      由于您用来确定获胜者的信息之一是游戏本身并且由于游戏本身从一开始就受到损害,因此您无法确定用户是否完成了游戏,如果flash/actionscript 决定获胜状态。即使脚本向服务器询问游戏路径中的秘密以确定获胜状态,您仍然可以模拟这一点,因此您无法确定您的服务器是响应真人游戏还是反编译的脚本和某人手动播放响应。

      你可以做什么:

      让人们更难伪造响应,让脚本为您提供完整的移动输出日志以进行分析,在每次下载游戏时使用一次性键盘来验证它是否是获胜者,保持计时器运行以确保玩家有足够的时间来玩游戏……这个帖子中提出的其他想法也很好。

      很抱歉带来坏消息。

      【讨论】:

        【解决方案5】:

        首先,不要给用户一个“秘密”代码来验证。

        在将页面交付给客户端时,创建一个“秘密”代码。可能 base64 编码的 GUID 会起作用。记录 guid、生成时间以及数据库中的浏览器指纹。

        游戏结束后,让动作脚本获取奖品发放的详细信息。将此连同代码一起发布回您的服务器。再次记录完成日期时间和浏览器指纹。

        要进行验证,请检查 guid 生成之间经过的时间量。还要查看浏览器指纹。

        作弊者会以三种方式脱颖而出。首先,日期/时间增量将非常短。您应该知道通常需要多长时间才能玩。其次,您可能会在您的页面上看到大量包含无效代码的帖子。第三,浏览器指纹甚至可以告诉您谁在使用自动化工具。

        更新
        我只是想指出一些你想要包括的东西。首先,@aaz 有一个很棒的想法,即在玩家填写获胜者信息时向他们询问有关游戏的问题。这应该是一些随机的元素。由于色盲人数众多,可能不是颜色;但在交付动作脚本之前,您当然可以控制和记录服务器端的东西。至少在发布结果时这需要一定程度的人工干预。

        其次,@John Lewis 有一个好主意,可以记录他们在游戏中的动作并提交这些动作。也许任何点击坐标都可以保存并立即发送回服务器并与日期/时间戳一起保存。您可以比较多个游戏中的这些坐标以寻找模式。智能分析很重要。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-25
          • 1970-01-01
          • 2015-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多