我遇到了一个问题。在OWASP备忘单之后,我在PHP中实现了一次性使用的CSRF令牌系统(基本上是从OWASP复制和粘贴)。每个表单或链接(生成某些操作的链接)将创建自己的CSRF令牌,一旦使用它,它将被删除。应用程序是一个网站,因此可以同时打开多个选项卡。
问题在于,每次加载页面时,它都会创建一个新的CSRF令牌(即使您只是点击重新加载而不是发送表单)。例如,在管理面板中,有一个项目列表,每个项目都可以使用具有CSRF令牌的链接删除(所有链接都使用相同的CSRF令牌),但是如果重新加载页面,则会生成新的csrf。
在一天结束时,我结束了比我想要的更多未使用的令牌。这是某些服务器中的问题。
TLDR;我为每个请求生成一个令牌。我删除了所有使用过的令牌(除了ajax请求令牌,我删除后一小时)。我的问题是UNUSED令牌,在一天结束时,它们太多了。
答案 0 :(得分:4)
没有(实际)方法知道您的用户是否仍会使用该令牌。因此,您必须在x小时后自动删除(并因此使其无效),例如使用cronjob。
只是一个建议:你确定你真的需要一次性代币吗? OWASP自己说安全性并不是绝对必要的:“一般来说,开发人员只需为当前会话生成一次此令牌。[...])(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet)。
请记住,一次性令牌也会使标签式浏览或浏览器历史记录变得非常痛苦。