【发布时间】:2018-05-23 05:34:01
【问题描述】:
在阅读了关于 CSRF 保护在 Rails 中的工作原理之后,我尝试通过这样做来触发 CSRF 保护:
注意:我们正在使用基于 cookie 的会话。
- 访问登录页面。检查 meta => abc123 中的 CSRF 令牌
- 打开第二个浏览器选项卡,然后访问相同的登录页面。元中的 CSRF 令牌不同 => def456
- 返回到第一个标签。
- 提交登录凭据。
我预计这会失败,因为第二个选项卡生成了一个新的、不同的 CSRF 令牌。当登录表单提交时,提交给服务器的令牌不应该是旧的,陈旧的吗?
但是,这确实有效:
- 访问登录页面。检查 meta => abc123 中的 CSRF 令牌
- 打开第二个浏览器选项卡,然后访问相同的登录页面。元中的 CSRF 令牌不同 => def456
- 返回到第一个选项卡。
- 提交登录凭据。
- 注销(清除会话)
- 转到第二个选项卡,然后提交登录信息。
在这种情况下,我得到了预期的 InvalidAuthenticityToken 异常。为什么?
【问题讨论】:
-
因为令牌链接到会话标识符 cookie。重置会话会使客户端持有的任何会话 cookie 无效。 guides.rubyonrails.org/action_controller_overview.html#session
-
@max 你介意详细解释一下吗?
-
也许这个问题的答案是一样的? stackoverflow.com/questions/50159847/…
标签: ruby-on-rails csrf-protection