表格上的令牌方法,双重提交问题

时间:2010-07-22 21:18:25

标签: php forms

我花了几周的时间在我的表单上进行双重保护。 Straightup,存储令牌的会话方法不起作用。

会话可以很好地刷新页面或有人回顾他们的历史......但是通过多次单击按钮的经典双提交无法使用会话来阻止。

我认为脚本不能足够快地检查/写入/删除会话,以便在相互之间的毫秒内处理多次点击时捕获错误。

是否有其他服务器端方法来防止此问题?

1 个答案:

答案 0 :(得分:3)

您似乎需要一个能够避免竞争条件的独立令牌存储。为了实现这一点,我们提供了几种解决方案,其中一种更容易实现:

  • 使用(tokencode,claimid)字段将令牌存储在数据库中。
  • 在接收时,将claimid设置为microtime(),甚至可能是进程ID或哈希值,只要它确保在彼此之间开始的类似进程中是唯一的。
  • 尝试声明令牌:UPDATE tokens SET claimid = <id> WHERE tokencode=tokencode AND claimid IS NULL
  • 计算上一个语句的行数(或执行选择)。
  • 如果某一行已更改和/或您的microtime()声明:您是赢家,请继续执行操作
  • 如果没有任何更改或令牌具有错误的声明,则不会采取行动。