我花了几周的时间来研究我的表单的双重提交保护。直接说,存储令牌的会话方法不起作用。
会话对于刷新页面或某人回顾其历史记录来说工作得很好......但是使用会话无法阻止通过多次单击按钮来进行经典的双重提交。
我认为当在几毫秒内处理多次点击时,脚本无法足够快地检查/写入/删除会话来捕获错误。
是否有另一种服务器端方法来防止此问题?
看来您需要一个能够避免竞争条件的独立令牌存储。为了使其发挥作用,可以使用多种解决方案,其中更容易实施的解决方案之一是:
- 使用 (tokencode,claimid) 字段将令牌存储在数据库中。
- 接收时,将 Claimid 设置为
microtime()
,甚至可能是进程 ID 或哈希值,只要它在彼此短时间内启动的类似进程中非常有保证是唯一的。
- 尝试领取令牌:
UPDATE tokens SET claimid = <id> WHERE tokencode=tokencode AND claimid IS NULL
- 计算上一个语句更改的行数(或执行选择)。
- 如果一行已更改和/或您的 microtime() 声明了 ID:您是获胜者,请继续执行操作
- 如果没有任何变化或者令牌有错误的 Claimid,则不会采取操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)