绕过 XHR 的 CSRF 保护是不是安全? (导轨)

Posted

技术标签:

【中文标题】绕过 XHR 的 CSRF 保护是不是安全? (导轨)【英文标题】:Is it safe to bypass CSRF protection for XHR? (Rails)绕过 XHR 的 CSRF 保护是否安全? (导轨) 【发布时间】:2017-04-04 00:50:17 【问题描述】:

我们的 webapp 的一个组件(或多或少)是一个 SPA。即它使用 javascript 运行,并且不会生成任何页面视图或刷新。这可能会导致 CSRF 令牌过时。特别是对于手机用户,他们可能会关闭浏览器并在几天/几周后打开它。此 SPA 有时需要将更新发布到服务器。

我们看到一些 javascript POST 请求会生成 422 错误,并带有关于 CSRF 保护的警告。我很确定 CSRF 令牌存在,但是已经过时了。我正在尝试找到解决它的最佳方法。

如果我理解正确,并且根据OWASP CSRF Cheat Sheet,只要 CORS 不在同一端点上打开,XHR 请求应该是安全的。也就是说,恶意网站无法在没有 javascript 的情况下制作带有 XHR 标头的请求。并且使用 javascript,请求应该被阻止,因为它是跨域的。

唯一的资源I found 有一个相当混乱的示例,其中对 json 禁用了 CSRF 保护。我不知道它是建议这样做还是避免这样做。

因此在未启用 CORS 的 Rails 上为 XHR/json 请求关闭 CSRF 保护是否安全/不安全?

【问题讨论】:

我创建了一个 PR 来更新 Rails 文档。见github.com/rails/rails/pull/31640 【参考方案1】:

简短的回答是它安全的,但你需要小心使用 CORS。

这是来自文档更改 I suggested 到 rails 的 sn-p:

从 CSRF 保护中排除 XHR 请求通常是安全的 (就像上面的代码 sn-p 一样),因为 XHR 请求只能从 相同的起源。但请注意,任何跨域第三方域 允许通过CORS 也将能够创建 XHR 请求。请务必检查您的 在禁用 XHR 的伪造保护之前 CORS 白名单。

请注意,我还没有收到 Rails 团队对此的任何反馈。

【讨论】:

以上是关于绕过 XHR 的 CSRF 保护是不是安全? (导轨)的主要内容,如果未能解决你的问题,请参考以下文章

保护基于prototype.js的XHR请求免受CSRF

6种方法绕过CSRF保护

利用XSS绕过CSRF令牌保护

公开会话的 CSRF 保护令牌是不是安全?

绕过Facebook CSRF保护——导致帐户接管

如何绕过csrf保护,并在burp suite中使用intruder?