我花了几周的时间来研究我的表单的双重提交保护。直接说,存储 token 的 session 方法不起作用。
session 对于刷新页面或某人回顾其历史记录来说效果很好......但是使用 session 无法阻止通过多次单击按钮来进行经典的双重提交。
我认为当多次点击在几毫秒内处理时,脚本无法足够快地检查/写入/删除 session 以捕获错误。
是否有其他服务器端方法来防止此问题?
最佳答案
看来您需要一个能够避免竞争条件的独立 token 存储。为了使其发挥作用,可以使用多种解决方案,其中更容易实现的解决方案之一是:
- 使用 (tokencode,claimid) 字段将 token 存储在数据库中。
- 收到后,将 ClaimID 设置为
microtime()
,甚至可能是进程 ID 或哈希值,只要它在彼此瞬间启动的类似进程中保证是唯一的。 - 尝试领取 token :
UPDATE tokens SET claimid = <id> WHERE tokencode=tokencode AND claimid IS NULL
- 计算上一个语句更改的行数(或执行选择)。
- 如果一行已更改和/或您的 microtime() 声明了 ID:您是获胜者,请继续执行操作
- 如果没有任何变化或者 token 的 Claimid 错误,则不会执行操作。
关于php - 表单上的 token 方法、双重提交问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313582/