php - 表单上的 token 方法、双重提交问题

标签 php forms

我花了几周的时间来研究我的表单的双重提交保护。直接说,存储 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/

相关文章:

jQuery 页面更改然后又变回来

javascript - 设置表单验证功能时遇到问题

php - Mysql Utf-8 和 PHP

mysql - 如何在drupal中进行php操作

php - 不使用模板引擎将逻辑与表示分离

php - 错误异常 : Creating default object from empty value

c++ - 开发 Windows 窗体应用程序?

javascript - rails : How to keep at least one form section displayed in edit forms

php - 框架和模板引擎有什么区别?

php - 如何使用简单的 jquery-ajax 调用上传文件