【发布时间】:2014-03-05 21:54:38
【问题描述】:
据我了解,有两种方法可以防止 CSRF 攻击:1) 每个会话的令牌,以及 2) 每个请求的令牌
1) 在第一种情况下,CSRF 令牌仅在用户会话初始化时生成一次。因此,用户一次只有一个有效令牌。
2) 在第二种情况下,每个请求都会生成新的 CSRF 令牌,然后旧的令牌变得无效。 漏洞利用变得更加困难,因为即使攻击者窃取了令牌(通过 XSS)当用户转到下一页时它也会过期。 但另一方面,这种方法会降低 webapp 的可用性。这是来自security.stackexchange.com的一个很好的引用:
例如,如果他们点击“返回”按钮并使用新值提交表单,则提交将失败,并且可能会以一些恶意错误消息迎接他们。如果他们尝试在第二个选项卡中打开资源,他们会发现会话在一个或两个选项卡中随机中断
在分析 Node.js Express 框架(基于 Connect)时,我注意到每个请求都会生成一个新的 CSRF 令牌, 但旧的不会失效。
我的问题是:在每个请求上提供新的 CSRF 令牌而不是使旧的无效的原因是什么? 为什么不只为每个会话生成一个令牌?
谢谢你,对不起我的英语!
【问题讨论】:
标签: node.js security express csrf