在同一台机器上的两个选项卡中打开同一页面时的 CSRF 令牌值?
Posted
技术标签:
【中文标题】在同一台机器上的两个选项卡中打开同一页面时的 CSRF 令牌值?【英文标题】:CSRF token value when same page is opened in two tabs on same machine? 【发布时间】:2021-02-01 23:32:05 【问题描述】:据我了解,当在服务器端启用 CSRF 时,服务器会创建一个令牌(比如 token1)并将其注入form
并将其保存在客户端浏览器的 cookie 中。
当客户端向服务器发送form
请求时,它会从浏览器cookie 中发送csrf 令牌(token1),并发送与form
中相同的令牌。服务器通过检查cookie中的token和form
中的token是否匹配来验证请求,然后处理请求。
现在,如果我在另一个选项卡中打开相同的 form
,服务器是否会生成另一个令牌 (token2) 并将其注入 form
和 cookie。然后,在 cookie 中,token1
将被 token2
覆盖。那么在第一个选项卡中提交表单在这种情况下不起作用吗?但根据经验,我看到在标签 1 中提交form
仍然成功。
那么有人可以解释一下它是如何在上述情况下取得成功的吗?
【问题讨论】:
稍微相关的 Q - CSRF Token and Second Tab 但没有答案 另一个相关的Q - CSRF token on a web page with multiple forms? 【参考方案1】:既然你已经添加了 Spring Security 标签,我将描述 Spring Security 如何使用 Synchronizer Token Pattern 来防止 CSRF 攻击。
服务器创建一个令牌(比如 token1)并将其注入表单并将其保存在客户端浏览器的 cookie 中。
实际情况并非如此。服务器将创建一个 CSRF 令牌 (token1) 并将该令牌存储在 HttpSession 中。 CSRF 令牌 (token1) 也嵌入在客户端的表单中。客户端还会获得一个存储在 cookie 中的 Session ID (session-id1)。
当客户端提交表单时,它会发送 token1 和 session-id1。然后,服务器将使用 session-id1 查找 HttpSession 并获取该会话的预期 CSRF 令牌。它将预期的 CSRF 令牌与令牌 1 进行比较,如果值不匹配,则 HTTP 请求将被拒绝。
如果您在另一个选项卡中打开相同的表单,浏览器仍然可以访问会话 ID (session-id1)。该表单将获得与 session-id1 关联的相同令牌 (token1)。
最后,只有一个 CSRF 令牌 (token1) 在两个选项卡中使用。
您可以在Spring Security reference documentation 中找到有关防止 CSRF 攻击的更多信息。
【讨论】:
感谢您将 HttpSession 引入图片中。 当用户在新标签页中打开不同的表单时会发生什么。我认为相同的 csrf 令牌(token1)也将用于第二种形式。我这么想是因为 spring-security 可能没有办法区分这些形式。如果 spring-security 根据表单名称等来识别表单,我可能是错的。如果是这种情况,那么开发人员应该注意不要在不同的表单中使用相同的表单名称。请分享您的想法。 Eleftheria,如果您能评论如何处理多个表单,如上文所述,将不胜感激。这一点非常重要,因为安全至关重要。 要求钢铁侠回归 - 这个帖子似乎有一个矛盾的方法 -The server includes two tokens in the response. One token is sent as a cookie. The other is placed in a hidden form field. The tokens are generated randomly so that an adversary cannot guess the values.
Introduction to CSRF
***.com/questions/65139184/…以上是关于在同一台机器上的两个选项卡中打开同一页面时的 CSRF 令牌值?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据登录成功在新窗口/选项卡或同一窗口/选项卡中打开页面?