【问题标题】:Prevent back button exploits? PHP [closed]防止后退按钮攻击? PHP [关闭]
【发布时间】:2014-09-21 18:50:51
【问题描述】:

我使用 Javascript 和 PHP 构建了一个简单的游戏。一旦用户达到目标分数,他们就可以将他们的名字添加到高分 mysql 数据库中。我正在使用 PHP POST 来获取他们的分数并将其添加到 mysql。

在某人获得高分并输入他们的姓名后,它会将分数变量重置为零,并将他们重定向回带有 header('location') 的主游戏页面。如果他们按一次后退按钮,一切都很好,这表明他们的分数为零,因为我重置了变量。但是,如果他们两次点击后退按钮,就会显示他们的高分,他们可以再次输入他们的名字,并用他们的名字淹没高分数据库。

无论如何要防止这种情况发生?

【问题讨论】:

  • 添加一些服务器端验证来验证高分是否已经提交。
  • @JimL 好的,谢谢,您可以指出的任何参考资料都可能详细说明如何做到这一点?
  • 在一个正在玩的游戏的会话中创建一个unique id。当他们提交分数时,请连同它一起提交唯一 ID,然后生成一个新 ID。如果他们再次尝试提交,请检查提交的 id 是否未被使用。
  • 谢谢@Doctus 我喜欢这个想法,并会试一试。我正在考虑在每个会话中在 php 中生成一个随机 sha1 哈希?
  • 如果您每次生成一个 sha1 哈希,您仍然必须生成与哈希不同的东西并希望没有冲突。如果您使用 uniqid 函数,它会将结果字符串基于当前时间,因此重复的可能性要小得多

标签: javascript php mysql


【解决方案1】:

在提供表单之前,您需要检查用户的至少一项识别特征并检查他们是否提交了分数。有多种方法可以做到这一点,每种方法都有自己的弱点,所以最好混合搭配,但我想到的一些方法包括:

  • 检查具有相同 IP 和用户代理字符串的人在过去 x 分钟内没有提交高分(尽管这可能会阻止提交一些合法分数 - 想想使用相同浏览器的学校/办公室并且具有相同的 ip)

  • 在到达时放置一个带有识别用户 ID 的跟踪 cookie。然后检查用户 ID 在过去 x 分钟内没有提交分数。 (例如,如果需要,可以启动 PHP 会话)

  • 在提交分数后将 cookie 添加到浏览器,然后在提供表单之前检查此 cookie(是的,可以通过删除 cookie 轻松解决此问题)。或者,您可以在会话中设置一个值)

【讨论】:

  • 谢谢,我将把你的想法与 Doctus 的评论结合起来,在每个会话中生成一个唯一的字符串
猜你喜欢
  • 2012-08-22
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多