我说的是没有上限分数的动作游戏,无法通过重放动作等来验证服务器上的分数.
我真正需要的是Flash/PHP中可能的最强加密,以及一种阻止人们通过我的Flash文件调用PHP页面的方法.我曾经尝试过一些简单的方法,可以对单个分数进行多次调用,完成校验和/斐波那契序列等,并且还使用Amayeta SWF加密对SWF进行模糊处理,但最终都被黑客攻击了.
感谢StackOverflow的回复,我现在从Adobe找到了更多信息 - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html和https://github.com/mikechambers/as3corelib - 我想我可用于加密.不知道这会让我想到CheatEngine.
如果它们不同,我需要知道AS2和AS3的最佳解决方案.
主要问题似乎是TamperData和LiveHTTP标题,但我知道还有更高级的黑客工具 - 比如CheatEngine(感谢Mark Webster)
这是互联网游戏和竞赛的经典问题.您的Flash代码与用户一起决定游戏的分数.但用户不受信任,Flash代码在用户的计算机上运行.你是SOL.您无法阻止攻击者伪造高分:
Flash比你想象的更容易进行逆向工程,因为字节码已经很好地记录并描述了一种高级语言(Actionscript)---当你发布一个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个标准偏差).确保您在服务器端跟踪游戏持续时间.
拒绝或隔离仅播放过一次或两次游戏的登录的高分,以便攻击者必须为他们创建的每次登录制作一个合理的游戏玩法的"纸质踪迹".
在游戏过程中"心跳"得分,以便您的服务器在一场比赛的整个生命周期中看到得分增长.拒绝不遵循合理分数曲线的高分(例如,从0跳到999999).
游戏过程中的"快照"游戏状态(例如,弹药数量,等级中的位置等),您可以稍后根据记录的中期分数进行协调.您甚至无需开始检测此数据中的异常; 你必须收集它,然后如果事情看起来很腥,你可以回去分析它.
禁用任何未通过安全检查的用户的帐户(例如,通过提交未通过验证的加密高分).
请记住,你只是在这里阻止高分欺诈.有没有什么可以做,以防止误.如果游戏中的线路有钱,有人会打败你想出的任何系统.目标不是阻止这种攻击; 这是为了使攻击更加昂贵,而不仅仅是擅长游戏并击败它.
你可能会问错误的问题.你似乎专注于人们用来在高分榜上进行游戏的方法,但阻止特定方法只是到目前为止.我对TamperData没有经验,所以我不能说.
您应该问的问题是:"我如何验证提交的分数是否有效且真实?" 具体方法是依赖游戏.对于非常简单的益智游戏,您可以发送得分以及特定的起始状态和导致结束状态的移动顺序,然后使用相同的移动在服务器端重新运行游戏.确认所述分数与计算得分相同,并且只有在匹配时才接受分数.
一种简单的方法是提供高分值的加密哈希以及自己的分数.例如,通过HTTP GET发布结果时:http://example.com/highscores.php? score = 500& checksum = 0a16df3dc0301a36a34f9065c3ff8095
在计算此校验和时,应使用共享密钥; 这个秘密永远不应该通过网络传输,但应该在PHP后端和flash前端中进行硬编码.上面的校验和是通过将字符串" secret " 预先添加到分数" 500 "并通过md5sum运行来创建的.
虽然该系统将阻止用户发布任意分数,但它不会阻止"重放攻击",其中用户重新发布先前计算的分数和散列组合.在上面的示例中,得分500将始终生成相同的哈希字符串.通过在要散列的字符串中包含更多信息(例如用户名,时间戳或IP地址),可以减轻某些风险.虽然这不会阻止重放数据,但它将确保一组数据一次只对单个用户有效.
为了防止发生任何重放攻击,必须创建某种类型的质询 - 响应系统,例如:
Flash游戏("客户端")执行http://example.com/highscores.php的HTTP GET,没有参数.此页面返回两个值:随机生成的salt值,以及该salt值与共享密钥组合的加密哈希值.此salt值应存储在待处理查询的本地数据库中,并且应该具有与之关联的时间戳,以便它可以在一分钟之后"到期".
Flash游戏将salt值与共享密钥组合在一起并计算哈希以验证它是否与服务器提供的哈希相匹配.此步骤对于防止用户篡改salt值是必要的,因为它验证salt值是否实际由服务器生成.
Flash游戏将盐值与共享密钥,高分值以及任何其他相关信息(昵称,IP,时间戳)相结合,并计算哈希值.然后,它通过HTTP GET或POST将此信息以及salt值,高分和其他信息发送回PHP后端.
服务器以与客户端相同的方式组合接收的信息,并计算散列以验证其是否与客户端提供的散列相匹配.然后,它还验证salt值是否仍然有效,如挂起查询列表中所列.如果这两个条件都为真,则将高分写入高分表并将签名的"成功"消息返回给客户端.它还会从挂起的查询列表中删除salt值.
请记住,如果用户可以访问共享密钥,则上述任何技术的安全性都会受到影响
作为替代方案,可以通过强制客户端通过HTTPS与服务器通信以及确保客户端预先配置为仅信任由您自己可以访问的特定证书颁发机构签名的证书来避免这种来回中的一些来回. .
我喜欢tpqf所说的,但是在发现作弊行为时,不是禁用帐户,而是实施蜜罐,这样每当他们登录时,他们就会看到他们的黑客攻击分数,并且从不怀疑他们被标记为巨魔.谷歌的"phpBB MOD巨魔",你会看到一个巧妙的方法.