Php 安全地为flash游戏的获胜者提供唯一的密码?

Php 安全地为flash游戏的获胜者提供唯一的密码?,php,mysql,security,actionscript,cryptography,Php,Mysql,Security,Actionscript,Cryptography,我想做的是:当一名玩家赢得一场游戏(用flash/actionscript编码)时,他们会得到一个个性化的密钥,他们可以通过电子邮件向我发送密钥以换取奖品。然后,我可以使用私有算法验证我端的密钥 我需要设计它,这样黑客在不赢得游戏的情况下几乎不可能生成有效的密钥。这可能吗 我假设任何SWF文件基本上都容易受到反编译的攻击,但我不知道它们到底有多容易受到攻击。也许黑客可以使用任何生成有效密钥的算法 我拥有actionscript 3中的所有方法,以及一个PHP/MySQL服务器,我控制着游戏的服务

我想做的是:当一名玩家赢得一场游戏(用flash/actionscript编码)时,他们会得到一个个性化的密钥,他们可以通过电子邮件向我发送密钥以换取奖品。然后,我可以使用私有算法验证我端的密钥

我需要设计它,这样黑客在不赢得游戏的情况下几乎不可能生成有效的密钥。这可能吗

我假设任何SWF文件基本上都容易受到反编译的攻击,但我不知道它们到底有多容易受到攻击。也许黑客可以使用任何生成有效密钥的算法

我拥有actionscript 3中的所有方法,以及一个PHP/MySQL服务器,我控制着游戏的服务器。

免责声明:我不使用flash

开始游戏时,我会从服务器获得一个唯一的令牌。在他们赢得游戏后,我将使用该唯一令牌生成一个代码,并将其显示给用户。然后,您可以根据来自服务器的令牌验证唯一代码

您可以做的另一件事是在他们玩游戏时以增量方式“构建”唯一的代码。如果他们不玩到底,他们至少要在整个游戏中回溯来生成代码


我想说的是,大多数游戏在某种程度上都容易受到反编译的影响,其目标是最大限度地减少损失。如果你在送出高价值的奖品,那么你当然会成为不择手段的人的目标

将密钥生成保留在服务器端。即使是一个简单的md5散列,保持精确的生成细节机密也是至关重要的。在生成的哈希中添加一些随机字符,这样看起来就不会像md5或sha1哈希

当然,问题变成了“我怎么知道用户真的赢了游戏”?反编译.swf会让一个有决心的用户知道你发送了“won=1”,然后砰的一声,你得到了一个获胜的关键码,可以说游戏到此结束

让您了解这有多困难:

几年前,有一个网站提供你玩的小flash游戏,你可以用它来换取奖励。它的编码非常马虎,以至于你不得不质疑网站运营商的理智。一些主要缺陷:

1) 每天都有一次调查。有几个选择的单一问题。他们将问题的分值作为隐藏值放入调查表中。它是通过GET提交的。只需在地址栏中执行“response.php?surveyID=XXX&choiceID=YYY&points=4294967295”,您就可以手动构建响应并每天给自己一次最大积分

2) 他们相对较快地抓住了这一点,修正了分数漏洞,但出于某种原因取消了每日限制,因此你可以以每次20分的价格提交任意次数的答案

3) 在他们解决了这个问题之后,人们开始对游戏进行黑客攻击——玩游戏并赢得比赛会给你(比如)100分。在这里,他们在发布时更聪明了一点,并且没有通过客户端来回传递点值。但是他们忘记了验证播放的次数,这是客户端保留的,所以你可以在他们的服务器上发帖子的次数中获得100分

4) 在解决了这个问题并将“玩过的次数”计数转移到服务器上之后,人们只是让他们的机器人提交游戏的特定限制,但对网站上的每一款游戏都提交了虚假声明

5) 在他们开始在游戏中设置检查点后(例如,“告诉服务器级别1已完成”、“看,他们刚刚完成级别2”等),人们只是将checkponit消息添加到他们的偷点机器人上

就这样一直走下去


如果你打算开始用任何有价值的奖品进行奖品申领,请注意,在短时间内,你可能会有很多次尝试将你的预算吸干。

你真正想做的是安全地确定游戏的赢家

这很难,但是,根据游戏的不同,您可以尝试:

  • 与服务器持续验证游戏状态(门打开、房间进入、地图上的坐标等),特别是关于时间(在坐标之间移动需要多长时间)

  • 提前决定比赛是赢还是输(例如)

  • 向获胜者询问有关比赛的问题(“奶牛是什么颜色的?”)


首先,不要给用户一个“密码”来验证

将页面交付给客户端时,请创建一个“机密”代码。可能base64编码的GUID可以工作。在数据库中记录生成guid时的guid和浏览器指纹

游戏结束后,让动作脚本获取奖金发放的详细信息。将其与代码一起发布回服务器。再次记录完成日期和时间以及浏览器指纹

要进行验证,请检查guid生成之间经过的时间量。还可以查看浏览器指纹

作弊者将在三个方面脱颖而出。首先,日期/时间增量将非常短。你应该知道比赛通常需要多长时间。第二,您可能会看到大量带有无效代码的页面帖子。第三,浏览器指纹甚至可以告诉你谁在使用自动化工具

更新
我只是想指出一些你想包括的东西。首先,@aaz想出了一个好主意,在玩家填写赢家信息时,向玩家询问有关游戏的问题。这应该是一些随机化的元素。可能不仅仅是因为色盲人数的原因而染上颜色;当然,在交付操作脚本之前,您可以在服务器端控制和记录一些东西。至少在发布时,这需要一定程度的人为干预