2010-09-14 38 views
0

我有一个基于Flash的浏览器游戏,它将用户的分数发送到一个php后端脚本,该脚本将分数和用户ID存储在数据库中。在提供AJAX或Flash请求时避免CSRF

现在我有一个像www.example.com/update.php?score=200 & UID一个url = 234

的问题是,这是非常暴露于智能用户,他可以用这个url来存储他想要的数据库中的任何分数。也没有真正的用户身份验证,我也不打算拥有一个,因为它确实是一个小游戏。

如何阻止某人拨打以上网址并自行更新他的分数。

回答

2

您可能想了解一下online polling system的“Marblecake”破解版。

将“提交投票”的概念替换为“提交得分”,您会发现任何客户端控件都会失败。

尽管可以加密分数或使用HMAC防止篡改,但您的加密将在Flash客户端中完成,并且Flash应用程序可以对关键字进行反向设计(它会增加所需的工作量作弊,但不会阻止作弊)。

为了最大限度地减少作弊,你必须将评分逻辑移动到服务器你必须运行理智检查或以其他方式验证玩家的行为;否则,作弊方法将执行导致更多分数的无效操作,而不是仅报告最终分数。 (最后一点是模糊的,因为它不清楚这是什么类型的游戏)。

至少,你应该能够将得分更新与特定用户相关联,以便作弊者只能影响他们自己的得分而不能其他'。我只能想办法限制作弊的效果,比如限制速度,所以如果平均游戏时间为N分钟,那么服务器每小时只能接受60/N分左右的更新。或者使用其他一些度量/时间段。但是,对于你所描述的小型游戏来说,这可能是不值得的 - 特别是因为它只能解决问题,所以它不能解决问题。

0

你不能。

这不是CSRF的问题了。由于您没有任何身份验证,任何人都可以更新其他人的分数。没有办法阻止这种情况的发生。

如果您关心安全性,请认证用户。这样至少可以防止攻击者大量更新分数。

然后,修复您的CSRF问题。对于每个这样的网址,您都需要添加一个唯一的令牌。

+0

感谢您的回复。雅我有点认为这不是一个真正的CSRF问题。我需要改变我的问题: 如果我需要从我的Flash应用程序发送数据到我的服务器,最好的安全防护方法是什么,这样不仅任何人都可以自己发送有效数据? 我想我可以加密我的Flash应用程序发送的数据,然后在后端将其解密,并且只有在数据库有效时才更新我的数据库。这是假设智能用户无法弄清楚我如何加密数据。 – Paganwinter 2010-09-17 08:12:21

+0

要做到这一点的唯一方法是使用登录名/密码对您的用户进行身份验证。加密数据不是解决方案,因为如果您必须将密钥存储在闪存swf文件中,并且智能用户可以轻松地从文件中提取该密钥。 – 2010-09-17 20:12:51