我一直在阅读如何实施CSRF令牌以防止CSRF攻击。 OWASP页面(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)和各种文章声明可以基于每页或每个会话生成随机唯一标记。 (他们建议每次会议产生一次)
如果每个会话只生成一个令牌,那么这并不意味着每次加载页面时所有使用该会话令牌的表单页都必须具有相同的令牌(无论何时说它都被刷新)?但在大多数实现中,我看到表单的每个加载都有一个不同的随机标记。
它是如何工作的?在服务器端每次成功检查后,会话中存在的CSRF令牌是否无效?
我只是想知道我是否理解这一点。我在Stackoverflow和其他博客上阅读了很多类似的问题,但我仍然感到困惑。
谢谢!
答案 0 :(得分:0)
我还没有阅读OWASP页面,但我相信在这种情况下,会话在访问者首次到达某个站点时启动,并持续到会话到期(无论是通过不活动还是其他一般情况)服务器定义的标准)或访问者关闭浏览器。
首次启动会话时,会话中不会出现CSRF令牌,因此服务器将生成一个,并将令牌存储在其内部数据中。将会话句柄返回给浏览器,当访问者加载或重新加载站点上的另一个页面时,它会将会话句柄返回给服务器,服务器发现它已经设置了CSRF令牌,并且使用现有的,而不是创建一个新的。因此,只要您只在会话中已经存在一个新令牌时才创建新令牌,您无需担心令牌无效。
答案 1 :(得分:0)
即使CSRF秘密仅在每个会话中生成一次,每个表单也可以通过对秘密进行盐析和散列(类似于密码被腌制和散列的方式)来获得不同的令牌。 s发送到浏览器。在表单提交时,服务器可以根据其秘密验证盐渍令牌(再次,类似于检查密码的方式)。这样,每个表单都可以获得自己唯一的令牌,而服务器不需要记住或使每个会话密钥以外的任何其他内容无效。