绕过XHR的CSRF保护是否安全?(路轨)

gin*_*ime 5 javascript ruby-on-rails xmlhttprequest csrf cors

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

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

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

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

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

gin*_*ime 1

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

以下是我向 Rails建议的文档更改的片段:

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

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