php - 阻止人们入侵Flash游戏的基于PHP的高分表的最好方法是什么

标签 php actionscript-3 security actionscript actionscript-2

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

我真正需要的是Flash / PHP中最强大的加密,以及一种防止人们通过我的Flash文件以外的方式调用PHP页面的方法。过去,我尝试过一些简单的方法来对单个分数进行多次调用,并完成校验和/斐波那契序列等,并使用Amayeta SWF Encrypt对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)

最佳答案

这是互联网游戏和竞赛的经典问题。您的Flash代码可与用户一起确定游戏得分。但是用户不受信任,并且Flash代码在用户的计算机上运行。你是SOL。您无法采取任何措施来阻止攻击者伪造高分:


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


对您系统的最简单攻击是通过代理运行游戏的HTTP流量,捕获高分保存,然后以更高的分数重播。

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

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))


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

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

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

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))


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

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))


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

因此,现在,攻击者反编译您的Flash代码,并迅速找到AES代码,该代码像拇指酸痛地伸出来,尽管即使没有通过存储搜索和示踪剂在15分钟内将其跟踪(“我在这款游戏中的得分是666,所以让我们在内存中找到666,然后进行任何触及该值的操作-哦,看,高分加密代码!”)有了会话密钥,攻击者甚至不必运行Flash代码。她获取了游戏启动令牌和会话密钥,并可以发回任意高分。

现在,大多数开发人员都放弃了---通过以下方式放弃或破坏攻击者几个月:


使用XOR操作加扰AES密钥
用计算密钥的函数替换密钥字节数组
在整个二进制文件中散布伪造的密钥加密和高分发布。


这全都是浪费时间。不用说,SSL也不会帮助您。当两个SSL端点之一为恶意时,SSL无法保护您。

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


需要登录才能玩游戏,让登录产生会话cookie,并且不允许在同一会话上进行多个未完成的游戏启动,或同一用户不允许进行多个并发会话。
拒绝持续时间少于有史以来最短的真实游戏的游戏会话的高分(对于更复杂的方法,对于持续时间少于平均游戏时间2个标准偏差的游戏会话,尝试“隔离”高分)。确保您正在服务器端跟踪游戏时间。
从仅玩过一次或两次游戏的登录中拒绝或隔离高分,因此攻击者必须为创建的每个登录产生合理外观的“纸迹”。
在游戏过程中,“ Heartbeat”得分很高,因此您的服务器可以在一个游戏的生命周期中看到得分的增长。拒绝不遵循合理分数曲线的高分(例如,从0跳到999999)。
游戏过程中的“快照”游戏状态(例如,弹药量,关卡中的位置等),您以后可以将其与记录的临时得分进行核对。您甚至不必以某种方式来检测此数据中的异常。您只需要收集它,然后可以回头再分析一下是否看起来很腥。
禁用任何未通过您的安全检查的用户的帐户(例如,通过提交未通过验证的加密高分)。


请记住,虽然您只是在阻止高分欺诈。您无法采取任何措施来防止这种情况的发生。如果您的游戏中有钱,那么有人将击败您想出的任何系统。目的不是制止这种攻击。这是使攻击变得更加昂贵,而不仅仅是真正擅长于击败游戏。

关于php - 阻止人们入侵Flash游戏的基于PHP的高分表的最好方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690413/

相关文章:

php - 循环多维数组以输出 uniq 数字的列表

actionscript-3 - Youtube AS3 API 内存泄漏

ios - AIR iOS 加载外部 swf ABC - 几乎成功

apache-flex - 我应该使用哪个版本的 Flex SDK 来支持 Flash Player10.0?

DNS 答案的安全性

php - MySQL将多个结果查询到单个值数组中

php - 更改文件夹结构以删除公用文件夹时对 Laravel 5 安全性的影响

java - Spring 安全: how to change user roles without login and logout

Php变量不保存数据

java - Android 中未找到 KeyGenerator AES 实现