我有一个基于Flash的浏览器游戏,它将用户的分数发送到php后端脚本,该脚本将分数和用户ID存储在数据库中。
现在我有一个网址,例如www.example.com/update.php?score=200&uid=234
问题在于,这非常暴露给智能用户,并且他可以使用此URL来存储他想要的数据库中的任何分数。此外,没有真正的用户身份验证,我也不打算拥有一个,因为它真的是一个小游戏。
如何阻止某人调用上述网址并自行更新其分数。
答案 0 :(得分:2)
您可能想了解一下online polling system的 用“提交分数”代替“提交投票”的概念,你会发现任何客户端控制都必然会失败。 虽然加密乐谱或使用HMAC防止篡改可能是一个很好的步骤,但您的加密将在Flash客户端中完成,Flash应用程序可以针对该键进行逆向工程(它会增加作弊所需的工作量) ,但不会阻止作弊)。 为了尽量减少作弊行为,您必须将评分逻辑移至服务器和,您必须运行完整性检查或以其他方式验证玩家的行为;否则,作弊的方法将是执行导致更多积分的无效行动,而不仅仅是报告最终得分。 (最后一点是模糊的,因为不清楚这是什么类型的游戏。) 至少,您应该能够将得分更新与特定用户联系起来,这样作弊者只能影响他们自己的得分,而不能影响他人。我只能想办法限制作弊的效果,例如速率限制,这样如果平均游戏是N分钟,服务器每小时只接受大约60 / N分数更新。或者使用其他一些指标/时间段。但是对于你所描述的那种可能不值得付出努力的小游戏 - 特别是因为它只能解决问题,它无法解决问题。
答案 1 :(得分:0)
你做不到。
这不再是CSRF的问题了。因为你没有任何身份验证,所以任何人都可以更新其他人的分数。没有办法阻止这种情况发生。
如果您担心安全性,请对用户进行身份验证。这至少可以防止攻击者集体更新分数。
然后,修复您的CSRF问题。对于每个URL,您需要附加一个唯一的令牌。