首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止人们黑进基于PHP的Flash游戏高分表的最好方法是什么

阻止人们黑进基于PHP的Flash游戏高分表的最好方法是什么
EN

Stack Overflow用户
提问于 2008-09-16 16:01:28
回答 18查看 29.8K关注 0票数 213

我说的是一个没有分数上限的动作游戏,也没有办法通过重放动作等来验证服务器上的分数。

我真正需要的是在Flash/PHP中尽可能最强的加密,以及一种防止人们调用PHP页面的方法,而不是通过我的Flash文件。我在过去尝试过一些简单的方法,比如对单个分数进行多次调用,完成校验和/斐波那契序列等,也使用Amayeta SWF加密来混淆SWF,但它们最终都被黑客入侵了。

多亏了StackOverflow的回复,我现在从Adobe找到了更多的信息-- http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.htmlhttps://github.com/mikechambers/as3corelib --我想我可以用它们来加密。不过,我不确定这会不会让我绕过CheatEngine。

我需要知道AS2和AS3的最佳解决方案,如果它们不同的话。

主要的问题似乎是像TamperData和LiveHTTP头这样的东西,但我知道还有更高级的黑客工具--比如CheatEngine (感谢Mark Webster)

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2008-09-16 17:32:22

这是互联网游戏和竞赛的一个典型问题。您的Flash代码与用户一起决定游戏的分数。但是用户不受信任,Flash代码在用户的计算机上运行。你是索尔。你无法阻止攻击者伪造高分:

  • Flash甚至比你想象的更容易逆向工程,因为字节码被很好地记录并描述了一种高级语言(Actionscript) -当你发布Flash游戏时,你就是在发布你的源代码,无论你知道与否。
  • 攻击者控制着Flash解释器的运行时内存,所以任何知道如何使用可编程调试器的人都可以随时改变任何变量(包括当前分数),或者改变程序本身。

针对您的系统的最简单的攻击可能是通过代理运行游戏的HTTP流量,捕获高分保存,并使用更高的分数重放它。

您可以尝试通过将每个高分保存绑定到游戏的单个实例来阻止此攻击,例如,通过在游戏启动时向客户端发送加密令牌,这可能如下所示:

代码语言:javascript
复制
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(您也可以使用会话cookie来达到相同的效果)。

游戏代码使用高分保存将该令牌回送到服务器。但是攻击者仍然可以再次启动游戏,获取令牌,然后立即将该令牌粘贴到重放的高分保存中。

因此,接下来您不仅要提供一个令牌或会话cookie,还要提供一个高分加密会话密钥。这将是一个128位的AES密钥,本身使用硬编码到Flash游戏中的密钥进行加密:

代码语言:javascript
复制
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

现在,在游戏发布高分之前,它会解密高分加密会话密钥,这是因为您将硬编码为Flash二进制文件。您可以使用此解密密钥以及高分的SHA1散列来加密高分:

代码语言:javascript
复制
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

服务器上的PHP代码检查令牌以确保请求来自有效的游戏实例,然后解密加密的高分,检查以确保高分与高分的SHA1匹配(如果跳过这一步,解密将只产生随机的,可能非常高的高分)。

所以现在攻击者反编译你的Flash代码,并快速找到AES代码,它像一个疼痛的拇指一样突出,尽管即使它没有,它也会在15分钟内通过内存搜索和跟踪被追踪到(“我知道我在这个游戏中的分数是666,所以让我们在内存中找到666,然后捕获任何触及这个值的操作--哦,看,高分数的加密代码!”)。有了会话密钥,攻击者甚至不必运行Flash代码;她可以获取游戏启动令牌和会话密钥,并可以发回任意高分。

你现在已经到了大多数开发人员都放弃的地步-花几个月的时间和攻击者打交道:

使用operations

  • Replacing密钥字节数组和函数计算key

  • Scattering伪密钥加密和整个二进制文件中的高分发布,从而使用
  • 对AES密钥进行加扰。

这主要是在浪费时间。不用说,SSL也不会对您有所帮助;当两个SSL端点中的一个是邪恶的时,SSL也不能保护您。

以下是一些可以实际减少高分欺诈的事情:

  • 需要登录才能玩游戏,让登录生成会话cookie,并且不允许在同一会话中启动多个未完成的游戏,或同一用户的多个并发会话。
  • 拒绝持续时间少于玩过的最短真实游戏的游戏会话的高分(有关更复杂的方法,请尝试对持续时间少于平均游戏持续时间2个标准差的游戏会话的高分进行“隔离”)。确保您正在跟踪游戏持续时间serverside.
  • Reject或隔离只玩过一次或两次游戏的登录帐户的高分,这样攻击者就必须为他们在玩游戏期间create.
  • "Heartbeat“得分的每个登录帐户生成一份合理的看起来像是玩游戏的”纸质痕迹“,这样您的服务器就可以看到一次玩游戏的整个生命周期中分数的增长。拒绝不遵循合理得分曲线的高分(例如,从0跳到999999)。游戏过程中的
  • “快照”游戏状态(例如,弹药量,关卡中的位置等),您可以稍后根据记录的临时分数进行调整。您甚至不必一开始就有一种方法来检测这些数据中的异常;您只需收集这些数据,然后如果任何用户的帐户未通过您的安全检查(例如,通过提交一个未通过验证的加密高分),您就可以返回并分析它( fishy.
  • Disable )。

但请记住,在这里,您只是在阻止高分欺诈。你不能做什么来防止如果。如果你的游戏中有钱,就会有人击败你想出的任何系统。这样做的目的不是为了阻止这种攻击;而是要让攻击的代价比仅仅是真正擅长游戏并击败它更昂贵。

票数 416
EN

Stack Overflow用户

发布于 2008-09-16 16:09:55

你可能问错了问题。你似乎专注于人们用来获得高分的方法,但阻止特定的方法只能做到这一点。我没有使用TamperData的经验,所以我不能对此发表意见。

你应该问的问题是:“我如何验证提交的分数是有效的和真实的?”实现这一目标的具体方法取决于游戏。对于非常简单的益智游戏,您可能会将分数连同特定的开始状态和导致结束状态的移动序列一起发送,然后使用相同的移动在服务器端重新运行游戏。确认声明的分数与计算的分数相同,如果匹配,则仅接受分数。

票数 25
EN

Stack Overflow用户

发布于 2008-09-16 16:51:32

要做到这一点,一种简单的方法是提供高分值的加密散列以及它本身的分数。例如,当通过HTTP GET发布结果时:

当计算这个校验和时,应该使用一个共享的秘密;这个秘密永远不应该在网络上传输,而应该在PHP后端和flash前端中进行硬编码。上面的校验和是通过将字符串"secret“附加到分数"500",并通过md5sum运行它来创建的。

虽然该系统将防止用户发布任意分数,但它不能防止“重放攻击”,即用户重新发布先前计算的分数和散列组合。在上面的示例中,得分为500将始终生成相同的散列字符串。通过将更多信息(如用户名、时间戳或IP地址)合并到要进行散列的字符串中,可以降低某些风险。虽然这不会阻止数据的重放,但它将确保一组数据在单个时间内仅对单个用户有效。

为了防止发生重播攻击,必须创建某种类型的质询-响应系统,如下所示:

  1. flash游戏(“客户端”)执行不带参数的的HTTP GET。此页面返回两个值:随机生成的Salt值和该Salt值与共享密钥相结合的加密散列。此Salt值应存储在挂起查询的本地数据库中,并且应具有与其关联的时间戳,以便它可以在大约一分钟后“过期”。
  2. flash游戏将Salt值与共享密钥组合在一起,并计算哈希以验证其是否与服务器提供的值匹配。此步骤是防止用户篡改Sales值所必需的,因为它会验证Salt值实际上是由服务器生成的。
  3. flash游戏将Salt值与共享秘密、高分值和任何其他相关信息(昵称、ip、时间戳)组合在一起,并计算哈希。然后,它通过HTTP GET或POST将此信息与盐值、高分一起发送回PHP后端,其他information.
  4. The服务器以与客户端相同的方式组合接收到的信息,并计算散列以验证这是否与客户端提供的信息匹配。然后,它还验证salt值是否仍然有效,如挂起查询列表中所列。如果这两个条件都为真,则将高分值写入高分数表,并向客户端返回签名为“成功”的消息。它还会从挂起的查询列表中删除salt值。

请记住,如果用户可以访问共享密钥,则上述任何技术的安全性都会受到损害

作为另一种选择,可以通过强制客户端通过HTTPS与服务器进行通信,并确保客户端预先配置为仅信任由您有权访问的特定证书颁发机构签署的证书,来避免这种反复。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档