在我看来,CSRF的主要目标是确认提出请求的客户是我们期望的客户。
我经常看到的解决方案是:
- 服务器生成随机CSRF令牌
- 服务器在cookie中设置CSRF令牌
-
- 服务器在生成表单时将CSRF令牌注入表单或
- 服务器将CSRF令牌传递给JavaScript,JavaScript将CSRF令牌注射为XMLHTTTPREQUESTS上的标题
- 收到请求后,通过检查cookie中的CSRF令牌是否匹配CSRF令牌,以标头/表单值匹配。
对我来说,服务器正在为(3((1(生成CSRF很有意义,但是我无法提出一个原因(3((2(。
。相反,如果客户端是纯JavaScript,我相信这是安全的:
- JavaScript生成随机CSRF令牌
- javaScript设置了cookie中的CSRF令牌
- JavaScript在制作XMLHTTPREQUEST 时,将通过CSRF令牌通过CSRF令牌
- 服务器检查标题和cookie Match中的CSRF令牌
我的理解是3和4都是攻击者无法做的事情,因此这也将足够阻止攻击。这是正确的吗?
如果是安全的,我们甚至需要执行步骤(1(和(2(?由于相同的原始策略(假设CORS配置正确(,这也是安全的吗?
- javaScript设置'csrf-safe:true'标题xmlhttprequest
- 服务器检查标题CSRF-SAFE是否存在并设置为" True"
是的,在存在CORS和相同原始政策的情况下,这两种简化的方法都应安全。实际上,只要验证内容类型,您甚至不需要CSRF-Safe: true
标头。
Wikipedia确认:
如果以任何其他格式发送数据(JSON,XML(,则标准方法是使用SOP和CORS预防的CSRF攻击的XMLHTTPREQUEST发布发布请求;有一种技术可以使用Enctype属性从简单的HTML表单发送任意内容。这样的虚假请求可以通过文本/普通内容类型与合法的请求区分开来,但是如果在服务器上没有执行此请求,则可以执行CSRF [12] [13]