这个问题仅与防止跨站点请求伪造攻击有关。
它具体是关于:通过 Origin 标头 (CORS) 进行的保护是否与通过 CSRF 令牌进行的保护一样好?
例子:
- Alice 使用她的浏览器登录(使用 cookie)到“ https://example.com ”。我假设,她使用的是现代浏览器。
- Alice 访问“ https://evil.com ”,evil.com 的客户端代码对“ https://example.com ”执行某种请求(经典的CSRF 场景)。
所以:
- 如果我们不检查 Origin 标头(服务器端),并且没有 CSRF 令牌,我们就有一个 CSRF 安全漏洞。
- 如果我们检查 CSRF 令牌,我们是安全的(但有点乏味)。
- 如果我们确实检查了 Origin 标头,那么应该像使用 CSRF 令牌时一样阻止来自 evil.com 的客户端代码的请求——除非有可能让 evil.com 的代码以某种方式设置 Origin 标头。
我知道,这对于 XHR 来说是不可能的(参见例如跨域资源共享的安全性),至少不会,如果我们相信 W3C 规范在所有现代浏览器中都能正确实现(我们可以吗?)
但是其他类型的请求呢——例如表单提交?加载 script/img/... 标签?或者页面可以用来(合法地)创建请求的任何其他方式?或者也许是一些已知的 JS hack?
注意:我不是在谈论
- 本机应用程序,
- 被操纵的浏览器,
- example.com 页面中的跨站点脚本错误,
- ...