javascript 客户端设置 CSRF 令牌是不是不安全?

Posted

技术标签:

【中文标题】javascript 客户端设置 CSRF 令牌是不是不安全?【英文标题】:Is it unsafe for the javascript client to set the CSRF token?javascript 客户端设置 CSRF 令牌是否不安全? 【发布时间】:2019-11-13 15:40:03 【问题描述】:

在我看来,CSRF 的主要目标是确认发出请求的客户是我们期望的客户。

我常见的解决方法是:

    服务器随机生成 CSRF Token 服务器在 cookie 中设置 CSRF 令牌
      服务器在生成表单时将 CSRF 令牌注入到表单中 或 服务器将 CSRF 令牌传递给 javascript,然后 javascript 将 CSRF 令牌作为 XMLHTTPRequests 上的标头注入
    收到请求后,会通过检查 cookie 中的 CSRF 令牌与标头/表单值中的 CSRF 令牌是否匹配来验证请求。

服务器正在为 (3)(1) 生成 CSRF 对我来说很有意义,但我想不出为什么需要 (3)(2) 的原因。

相反,如果客户端是纯javascript,我相信这是安全的:

    Javascript 生成随机 CSRF 令牌 Javascript 在 cookie 中设置 CSRF 令牌 Javascript 在发出 XMLHTTPRequest 时在标头中传递 CSRF 令牌 服务器检查标头和 cookie 中的 CSRF 令牌是否匹配

我的理解是 3 和 4 都是攻击者不能做的事情,所以这也足以阻止攻击。对吗?

如果那个安全的,我们还需要执行步骤(1)和(2)吗?由于同源策略(假设 cors 配置正确),这是否也是安全的?

    Javascript 在 XMLHTTPRequest 中设置一个 'CSRF-Safe: true' 标头 服务器检查标头 CSRF-Safe 是否存在并设置为“true”

【问题讨论】:

为什么你认为攻击者不能做 1 到 4 甚至更多?大多数攻击者甚至不会使用您的代码,并且会制作适合漏洞的请求,在您的情况下,只需将标头和 cookie 设置为某个随机值以绕过检查。 @LawrenceCherone,但如果他们这样做了,他们不能生成已知代码并将其用于(1)和(2) @LawrenceCherone 我也有独特的会话 cookie 来授权请求​​。当客户端是浏览器时,我相信 CSRF 只是为了验证客户端。据我所知,移动应用程序代码不需要进行 CSRF 检查。 @LawrenceCherone,我想我的问题让我意识到我们在同一页上。我只是在处理您关于 (1) 和 (2) 的未经编辑的评论。 CSRF 是为了防止登录用户通过 mitm replay 或一些已经通过的 xss 代码对他们的知识进行一些操作。 【参考方案1】:

是的,在 CORS 和同源策略存在的情况下,这两种简化方法都应该是安全的。事实上,只要验证内容类型,您甚至不需要 CSRF-Safe: true 标头。

***confirms:

如果数据以任何其他格式(JSON、XML)发送,标准方法是使用 XMLHttpRequest 发出 POST 请求,并通过 SOP 和 CORS 阻止 CSRF 攻击;有一种技术可以使用 ENCTYPE 属性从简单的 html 表单发送任意内容;这样的虚假请求可以通过 text/plain 内容类型与合法请求区分开来,但如果服务器上没有强制执行,则可以执行 CSRF[12][13]

【讨论】:

以上是关于javascript 客户端设置 CSRF 令牌是不是不安全?的主要内容,如果未能解决你的问题,请参考以下文章

反 CSRF 令牌和 Javascript

对 CSRF 保护策略感到困惑

在 javascript POST 中发送 CSRF 令牌会出现错误

如何在 javaScript 中获取 CSRF 令牌值

javascript 使用Cookie获取CSRF令牌

将 csrf 令牌传递给客户端应用程序