使用CORS Origin头与CSRF令牌的CSRF保护

这个问题只关于防止跨站点请求伪造攻击。

具体来说就是:通过Origin头部(CORS)的保护和通过CSRF令牌的保护一样好吗?

例:

  • Alice使用浏览器login(使用cookie)“ https://example.com ”。 我假设她使用现代浏览器。
  • Alice访问“ https://evil.com ”,evil.com的客户端代码对“ https://example.com ”(传统的CSRF场景)执行某种请求。

所以:

  • 如果我们不检查Origin头(服务器端),并且没有CSRF令牌,那么我们有一个CSRF安全漏洞。
  • 如果我们检查一个CSRF令牌,我们是安全的(但有点乏味)。
  • 如果我们检查Origin头文件,那么来自evil.com的客户端代码的请求应该被阻塞,就像使用CSRF令牌时一样 – 除非可以以某种方式为evil.com的代码设置Origin头部。

我知道,如果我们相信W3C规范在所有现代浏览器中都能正确实现,那么XHR就不可能实现这一点(参见例如跨源资源共享的安全性 ),至less不能。

但是其他types的请求呢 – 比如表单提交? 加载脚本/ img / …标签? 或者页面可以用来(合法地)创build请求的其他方式? 或者,也许一些知名的JS黑客?

注:我不是在说

  • 本地应用程序
  • 操纵浏览器,
  • 跨网站脚本错误在example.com的页面,

我们知道,如果我们相信W3C规范在所有现代浏览器中都能正确实现,那么XHR就不可能实现这一点(参见例如跨源资源共享的安全性),至less不能。

在一天结束时,您必须“信任”客户端浏览器来安全地存储用户的数据并保护会话的客户端。 如果你不信任客户端浏览器,那么除了静态内容之外,你应该停止使用networking。 即使使用CSRF令牌,您仍然信任客户端浏览器正确遵守“ 同源策略” 。

虽然以前的浏览器漏洞(如IE 5.5 / 6.0中的攻击者可能会绕过“同源策略”并执行攻击),但您通常可以期望在发现这些漏洞后立即对其进行修补,并且大多数浏览器会自动更新,这种风险将大大减轻。

但是其他types的请求呢 – 比如表单提交? 加载脚本/ img / …标签? 或者页面可以用来(合法地)创build请求的其他方式? 或者,也许一些知名的JS黑客?

Origin报头通常只发送XHR跨域请求。 图片请求不包含标题。

注:我不是在说

  • 本地应用程序

  • 操纵浏览器,

  • 跨网站脚本错误在example.com的页面,

我不确定这是否属于被操纵的浏览器,但是老版本的Flash允许设置任意的头文件,攻击者可以使用来自受害者机器的欺骗referer头来发送请求,以执行攻击。

Web内容不能篡改Origin标头。 而且,在同一起源策略下,一个起源甚至不能将自定义标题发送到其他起源。 [1]

因此,检查Origin头文件与使用CSRF令牌一样有效阻止攻击

主要关心的是它是否允许所有合法的请求工作。 提问者知道这个问题,并且已经build立了排除重大案件的问题(没有旧的浏览器,只有HTTPS)。

浏览器供应商遵循这些规则,但是插件呢? 他们可能不会,但这个问题无视“被操纵的浏览器”。 那么让攻击者伪造Origin头部的错误在浏览器中呢? 可能有一些错误让CSRF令牌泄漏,所以需要更多的工作来争辩一个比另一个更好。