【问题标题】:Avoiding CSRF when serving AJAX or Flash requests在处理 AJAX 或 Flash 请求时避免 CSRF
【发布时间】:2010-09-14 13:24:42
【问题描述】:

我有一个基于 Flash 的浏览器游戏,它将用户的分数发送到一个 php 后端脚本,该脚本将分数和用户 ID 存储在数据库中。

现在我有一个类似 www.example.com/update.php?score=200&uid=234 的网址

问题是这对聪明的用户来说非常容易,他可以使用这个 url 在数据库中存储他想要的任何分数。也没有真正的用户身份验证,我也不打算拥有,因为它真的是一个小游戏。

我怎样才能阻止某人调用上述网址并自行更新他的分数。

【问题讨论】:

    标签: php ajax flash security csrf


    【解决方案1】:

    您可能想了解online polling system 的“Marblecake”黑客攻击。

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

    虽然一个好的步骤可能是加密分数或使用 HMAC 来防止篡改,但您的加密将在 Flash 客户端中完成,并且 Flash 应用可以针对密钥进行逆向工程(这增加了作弊所需的工作量,但不会阻止作弊)。

    为了最大程度地减少作弊,您必须将计分逻辑移至服务器并且您必须运行健全性检查或以其他方式验证玩家的行为;否则,作弊的方法将是执行导致更多分数的无效操作,而不仅仅是报告最终分数。 (最后一点含糊不清,因为不清楚这是什么类型的游戏。)

    至少,您应该能够将分数更新绑定到特定用户,这样作弊者只能影响自己的分数,而不会影响他人的分数。我只能想办法限制作弊的效果,比如限速,如果平均游戏时间为 N 分钟,服务器每小时只接受 60/N 左右的分数更新。或使用其他一些指标/时间段。但是对于你所说的可能不值得付出努力的小游戏——尤其是因为它只限制了问题,并不能解决问题。

    【讨论】:

      【解决方案2】:

      你不能。

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

      如果您担心安全性,请对用户进行身份验证。这至少可以防止攻击者大规模更新分数。

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

      【讨论】:

      • 感谢您的回复。是的,我有点认为这不是真正的 CSRF 问题。我需要将我的问题改为:如果我需要将数据从我的闪存应用程序发送到我的服务器,那么保护它的最佳方法是什么,以便不仅仅是任何人都可以自己发送有效数据?我想我可以加密我的闪存应用程序发送的数据,然后在后端解密它,只有在它有效的情况下才更新我的数据库。这是假设智能用户仍然无法弄清楚我是如何加密数据的。
      • 唯一的方法是使用登录名/密码对用户进行身份验证。加密数据不是解决方案,因为如果您必须将密钥存储在 flash swf 文件中,并且智能用户可以轻松地从文件中提取该密钥。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多