2011-06-08 85 views
3

我目前和朋友一起在Flash游戏上工作。 当玩家完成游戏时,他希望将分数插入数据库中。 他使用本教程的闪光灯 - http://www.tizag.com/flashTutorial/flashforms.php。 他制作的swf效果很好 - 它发布数据。问题是我可以看到来自萤火虫的请求。这开辟了另一个问题 - 任何更高级的用户可能会插入他自己的分数,而不玩游戏...隐藏POST/GET请求 - 闪存和PHP

那么有没有办法隐藏Flash游戏的请求? 这个问题的正确方法是什么?

回答

5

不,实在无法隐藏所做的请求。这是不可能的,如果Firebug或Live HTTP Headers在Web浏览器中运行,它不仅可以拦截它,还可以加载Wireshark并查找所有传入和传出流量并分析它。你需要的是一种加密或破坏的方法。例如,取他们的分数base64_encode(),然后取当前时间,将其反转(也可以在其末尾添加一个键),然后取其MD5。将所有三条信息提交给服务器,如果时间超过5秒,他们可以编辑请求并发送一个错误信息。通过倒转来检查时间的有效性(然后如果你使用了一个密钥,则将其加入),并确定它们是否匹配。当然,你可以运行一些复杂的加密算法,但最终没有意义:

有没有万无一失的方法来解决这个问题。我曾经在逆向工程领域工作。我可以告诉你,我可以在任何Flash游戏中编辑任何值。因此,虽然提交评分可能有点安全,但我可以反编译你的游戏并查看代码,并查看你做了什么来破坏评分提交。或者,更容易的是,我可以编辑大概在60秒以内的分数值。 Adobe Flash Player将变量存储在内存中,这就是缺点,我可以轻松地在内存中编辑这些变量和值。

如果您正在努力应对防止逆向工程的挑战,我会说您只是停止在破坏之中,并希望没有人像我一样玩您的游戏。为防止逆向工程做了许多尝试,我只是这样说:破坏和“安全”只会让诚实的人不在。对于现实世界和编程都是如此。真正想要利用系统并具备这种能力的人很容易。它只会阻止偶然的黑客和骗子作弊。安全和避开它的方法之间的平衡总是接近平衡。

+0

我只是为了防止作弊。你会推荐什么来阻止人们通过对myScript.php进行POST来作弊? – tftd 2011-06-08 13:02:50

+0

不,POST和GET对我来说都是一样的。两者都很容易被截获。 – LostInTheCode 2011-07-17 20:14:03

1

解决方案可能是使用某种形式的预加密密钥进行加密。服务器和Flash应用程序都需要使用算法对请求进行编码。如果你想要做的只是重复请求,你仍然可以很容易地解决这个问题。

这是基于AES的一些信息,看起来我的权利: http://www.lostinactionscript.com/blog/index.php/2009/11/29/aes-cryptography-for-actionscript-php/

PS:当然也有更加复杂的解决方案,涉及的算法来确定基于一些测试下一个预共享密钥,但这似乎太多的网页游戏。

1

解决此问题的简单方法是作为额外参数传递(当发布到保存到db的页面时),例如,可以是分数的md5加上一个秘密字符串。 例如,如果您发送的POST数据score:12345,你可以这样做score:12345&key:119c8901b84be882530d60a45539705f

在我的例子我计算的12345_secret的MD5。 当您在服务器recive你的数据,你救他们只有md5(score+'_secret') == key

+0

嗯,这种方法的一个问题是,所有的分数都与关键字相匹配,因此如果我的朋友得分为9999,而我得分为10,则我可以使用他请求中的数据并得到9999的分数以及。使用一个变量,如时间参数,可以阻止它。但是,好的答案,+1 – LostInTheCode 2011-06-08 12:49:19

+0

是的,当然,你使用的变量越多,它变得越安全 - 包括一个唯一的用户ID当然是一个不错的选择 – ArtoAle 2011-06-08 13:29:25

1

除了加密通讯,你可能会考虑增加一些“闯关” - 曾经在一段时间,从客户端发送一些状态到服务器。这可能会引入一些延迟,但它可以使服务器上的客户端状态成为可能。为了完全(好,几乎全部)安全,所有关于每个用户行为的决定都应该在服务器上进行。这对于模拟用户操作的复杂机器人来说不起作用,但它将证明它不符合“分数提交者”。

+0

好吧,如果他们可以编辑这些问题,这不会解决问题“检查站”的提交 – LostInTheCode 2011-06-08 12:51:00

+0

@LostInTheCode,正如你已经写到的,没有什么是万无一失的。最安全的解决方案是使用高度加密的流量来发送用户的操作并在服务器上(而不是在Flash游戏本身)做出决定,但即使这样也不会100%安全。 – binaryLV 2011-06-08 14:34:36

1

只要控件驻留在客户端上,就无法保护您的游戏。客户的人数越多,获得高分的机会越大。

我们从最简单的方法开始:客户在游戏结束时提交分数。您可以使用任何您想要的棘手加密方法,但作弊者可以简单地调整内存中存储的分数。他甚至不需要知道你是如何加密数据的。

即使您在整个游戏过程中定期进行此操作,它并不重要。考虑到时间限制,服务器可能会尝试估计高分是无效的,但在某些时候,最终得分足够接近以至于无法丢弃它。

骗子也可以改变游戏给自己一个不公平的优势。说游戏的一部分围绕着能够猜测宝藏在哪个门后面。他们所要做的就是破解游戏,向他们展示数据。他们甚至不必修改分数生成代码......因为他们让游戏本身变得更加简单。

在不受信任的平台上安全解决此问题的唯一方法是将游戏玩法的重要部分卸载到服务器本身。客户变成了一个愚蠢的终端,无论它被告知什么。服务器根据客户的行为实时追踪高分。如果客户不知道哪个门持有宝藏,则不能在上述示例中作弊。但是,这涉及服务器跟踪每个客户端的数据,这会导致您的资源使用量更高。根据游戏的类型,它可能不可行。

而且,这一切都不是对所有黑客的失败保险。例如,一个作弊者可以写出一个具有超凡反应的机器人,否则这个机器人会遵守所有的规则。

如果你的游戏足够小,不会引起太多关注,其中一些是不必要的担心。这是最终的安全性:制作一款没有人愿意玩的游戏,因此没有人会打扰黑客攻击。 ;)

所有这一切说/总而言之,这里有一些事情可以做:

  1. 商店高分的几个变量,在内存中加密的实际内容。也就是说,试图摆脱正在寻找记忆的骗子试图找到分数。

  2. 与服务器通信时使用某种加密方式。您不希望骗子能够简单地嗅探流量并发出POST请求......这太容易了。

  3. 验证考虑到播放的时间量,分数是有意义的。您可以定期向服务器每五秒钟报告一次分数等。

  4. 使客户端尽可能愚蠢......使服务器具有权威性。

  5. 如果有人发布绝对无效的分数,请禁止该IP地址和/或用户帐户。

  6. 祈祷您的游戏在黑客中不是很受欢迎。

-1

您可以使用amfphp,它会隐藏您的请求。

+2

我已经添加了一个链接,但多一些信息也可以在这个答案中有所帮助。 – Spudley 2011-10-13 08:22:06

+0

这是如何隐藏请求的?是用该技术制作的http://amfphp.sourceforge.net/?如果是这样,我已经能够看到请求:) – tftd 2011-10-13 15:36:35