JavaScript客户端设置CSRF令牌是不安全的吗?



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

我经常看到的解决方案是:

  1. 服务器生成随机CSRF令牌
  2. 服务器在cookie中设置CSRF令牌
    1. 服务器在生成表单时将CSRF令牌注入表单或
    2. 服务器将CSRF令牌传递给JavaScript,JavaScript将CSRF令牌注射为XMLHTTTPREQUESTS上的标题
  3. 收到请求后,通过检查cookie中的CSRF令牌是否匹配CSRF令牌,以标头/表单值匹配。

对我来说,服务器正在为(3((1(生成CSRF很有意义,但是我无法提出一个原因(3((2(。

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

  1. JavaScript生成随机CSRF令牌
  2. javaScript设置了cookie中的CSRF令牌
  3. JavaScript在制作XMLHTTPREQUEST
  4. 时,将通过CSRF令牌通过CSRF令牌
  5. 服务器检查标题和cookie Match中的CSRF令牌

我的理解是3和4都是攻击者无法做的事情,因此这也将足够阻止攻击。这是正确的吗?

如果是安全的,我们甚至需要执行步骤(1(和(2(?由于相同的原始策略(假设CORS配置正确(,这也是安全的吗?

  1. javaScript设置'csrf-safe:true'标题xmlhttprequest
  2. 服务器检查标题CSRF-SAFE是否存在并设置为" True"

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

Wikipedia确认:

如果以任何其他格式发送数据(JSON,XML(,则标准方法是使用SOP和CORS预防的CSRF攻击的XMLHTTPREQUEST发布发布请求;有一种技术可以使用Enctype属性从简单的HTML表单发送任意内容。这样的虚假请求可以通过文本/普通内容类型与合法的请求区分开来,但是如果在服务器上没有执行此请求,则可以执行CSRF [12] [13]

最新更新