我目前正在与朋友一起玩Flash游戏。 当玩家完成游戏时,他希望将分数插入数据库中。 他正在使用本教程进行flash - http://www.tizag.com/flashTutorial/flashforms.php。 他制作的瑞士法郎很有效 - 它发布了数据。问题是我可以看到来自firebug的请求。这开启了另一个问题 - 任何更高级的用户都可以在不玩游戏的情况下插入自己的分数......
那么有没有办法隐藏Flash游戏的请求? 这个问题的正确方法是什么?
答案 0 :(得分:5)
不,没有办法真正隐藏所提出的请求。这是不可能的,如果在Web浏览器中运行,不仅firebug或Live HTTP Headers可以拦截它,我可以加载Wireshark并查找所有传入和传出流量并进行分析。您需要的是加密或复制的方法。例如,取他们的分数,base64_encode()它,然后取当前时间,反转它(并可能在它的末尾添加一个键),然后取MD5。将所有三条信息提交给服务器,如果时间超过5秒,他们可能已经编辑了请求并发送了错误信息。通过反转来检查时间的有效性(如果你使用的话,然后将密钥添加到它中)并获取MD5并确保它们匹配。当然,你可以运行一些复杂的加密算法,但最终没有意义:
没有万无一失的方法可以解决这个问题。我曾经在逆向工程领域工作。我可以告诉你,我可以在任何Flash游戏中编辑任何值。因此,虽然提交分数可能有些安全,但我可以反编译你的游戏并查看代码,看看你做了什么来改变分数提交。或者,更简单的是,我只需编辑保持得分的值可能不到60秒。 Adobe Flash Player将变量存储在内存中,这就是弱点所在,我可以轻松地在内存中编辑这些变量和值。
如果你正在努力接受防止逆向工程的挑战,我说你只是停止了这种模仿,希望没有像我这样的人在玩你的游戏。为防止逆向工程已经做了很多尝试,让我这样说:复制和“安全”只会让诚实的人离开。这对现实世界和编程都是如此。真正想要利用系统并具备相关技能的人很容易。它只会让随意的黑客和骗子免于作弊。安全与规避风险的方法之间的平衡总是接近平衡。
答案 1 :(得分:2)
只要控件驻留在客户端上,就无法保护您的游戏。客户的笨蛋,你获得高分的机会就越大。
我们从最简单的方法开始:客户端在游戏结束时提交分数。你可以使用你想要的任何棘手的加密方法,但是骗子可以简单地调整内存中存储的分数。他甚至不需要知道你是如何加密数据的。
即使你在整个游戏过程中定期这样做,也没关系。考虑到时间限制,服务器可能会尝试估计高分无法有效,但在某些时候,您最终会得到一个足够有效且无法丢弃的分数。
骗子也可以改变比赛,给自己一个不公平的优势。说游戏的一部分围绕着能够猜出宝藏在哪个门后面。他们所要做的就是破解游戏以向他们展示数据。他们甚至不必修改得分生成代码......因为他们让游戏本身变得更容易。在不受信任的平台上安全解决此问题的唯一方法是将游戏玩法的重要部分卸载到服务器本身。客户成为各种各样的愚蠢终端,无论做什么都告诉他们。服务器根据客户端的操作实时跟踪高分。如果客户不知道哪个门拿着宝藏,你就不能在上面的例子中作弊。但是,这涉及服务器跟踪每个客户端的数据,这会使您的资源使用量增加。根据游戏的类型,它可能不可行。
而且,这一切都不是针对所有黑客的失败安全措施。例如,一个骗子可以编写一个具有优越反应能力的机器人,否则它将按照所有规则进行游戏。
如果您的游戏足够小而不会引起太多关注,那么其中一些是不必要的担心。这是最终的安全:制作一个没有人想玩的游戏,因此没有人愿意破解。 ;)
所有这些/总之,这里有一些你可以做的事情:
将高分存储在多个变量中,加密内存中的实际内容。也就是说,试着甩掉那些正在寻找记忆的骗子,试图找到分数。
与服务器通信时使用某种加密方式。你不希望骗子能够简单地嗅到流量并发出POST请求......这太容易了。
根据播放的时间,验证分数是否有意义。您可以每隔五秒钟定期向服务器报告分数等,
让客户端尽可能愚蠢......让服务器具有权威性。
如果有人发布绝对无效的分数,请禁止该IP地址和/或用户帐户。
祈祷你的游戏在黑客中不是很受欢迎。
答案 2 :(得分:1)
解决方案可能是使用预共享密钥的某种形式的加密。服务器和Flash应用程序都需要使用算法来对请求进行编码。如果您想要做的只是重复请求,您仍然可以相当容易地破解。
以下是一些基于AES的信息,它对我来说是正确的: http://www.lostinactionscript.com/blog/index.php/2009/11/29/aes-cryptography-for-actionscript-php/
PS:当然还有更复杂的解决方案,涉及一种基于某种测试确定下一个预共享密钥的算法,但对于网页游戏来说这似乎太多了。答案 3 :(得分:1)
解决此问题的简单方法是作为额外参数传递(当发布到保存到db的页面时),例如,可以是分数的md5加上秘密字符串。
例如,如果您以POST数据score:12345
发送,则可以执行score:12345&key:119c8901b84be882530d60a45539705f
在我的例子中,我计算了12345_secret
的md5。
当您在服务器中重新获取数据时,只有在md5(score+'_secret') == key
答案 4 :(得分:1)
除了加密流量外,您可能会考虑添加一些“检查点” - 偶尔会将一些状态从客户端发送到服务器。这可能会引入一些延迟,但它可以跟踪客户端在服务器上的状态。为了使其完全(几乎完全)安全,所有关于每个用户操作的决定都应该在服务器上进行。这不会对模拟用户操作的复杂机器人起作用,尽管它可以证明“得分提交者”。
答案 5 :(得分:-1)
您可以使用amfphp,它会隐藏您的请求。