Javascript 防止后退按钮攻击?PHP

Javascript 防止后退按钮攻击?PHP,javascript,php,mysql,Javascript,Php,Mysql,我用Javascript和PHP构建了一个简单的游戏。一旦用户达到目标分数,他们就可以将自己的名字添加到highscore mysql数据库中。我正在使用PHPPost获取他们的分数并将其添加到mysql 在某人获得高分并输入姓名后,它会将分数变量重置回零,并将其重定向回带有标题(“位置”)的游戏主页面。如果他们点击后退按钮一次,一切都很好,这表明他们的分数是零,因为我重置了变量。但是,如果他们按两次后退按钮,就会显示他们的高分,他们可以再次输入自己的名字,并用自己的名字填充高分数据库 无论如何

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

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


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

您需要检查用户的至少一项识别功能,并检查他们在提交表单之前是否提交了分数。有多种方法可以做到这一点,每种方法都有各自的缺点,因此最好是混合搭配,但我脑子里想不出的一些方法包括:

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

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

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


在提交表单之前,您需要检查用户的至少一项识别功能,并检查他们是否提交了分数。有多种方法可以做到这一点,每种方法都有各自的缺点,因此最好是混合搭配,但我脑子里想不出的一些方法包括:

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

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

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


在提交表单之前,您需要检查用户的至少一项识别功能,并检查他们是否提交了分数。有多种方法可以做到这一点,每种方法都有各自的缺点,因此最好是混合搭配,但我脑子里想不出的一些方法包括:

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

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

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


在提交表单之前,您需要检查用户的至少一项识别功能,并检查他们是否提交了分数。有多种方法可以做到这一点,每种方法都有各自的缺点,因此最好是混合搭配,但我脑子里想不出的一些方法包括:

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

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

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


添加一些服务器端验证,以验证是否已提交高分。@JimL好的,谢谢,您可以向我提供任何可能详细说明如何执行此操作的参考资料吗?在正在玩的游戏的会话中创建一个。当他们提交分数时,将唯一id与分数一起提交,然后生成一个新的id。如果他们再次尝试提交,请检查提交的id是否未被使用。谢谢@Doctus我喜欢这个想法,并将尝试一下。我正在考虑在php中为每个会话生成一个随机的sha1散列?如果每次都生成一个sha1散列,那么仍然需要生成一些不同的散列,并希望不会发生冲突。如果使用uniqid函数,则结果字符串基于当前时间,因此重复的可能性要小得多添加一些服务器端验证以验证高分是否已提交。@JimL确定,谢谢,你能给我指的任何参考资料都可能详细说明如何做到这一点?在游戏的会话中创建一个。当他们提交分数时,将唯一id与分数一起提交,然后生成一个新的id。如果他们再次尝试提交,请检查提交的id是否未被使用。谢谢@Doctus我喜欢这个想法,并将尝试一下。我想在php中为每个会话生成一个随机sha1哈希