【发布时间】:2014-09-01 01:12:28
【问题描述】:
这个问题仅是关于防止跨站请求伪造攻击。
具体是关于:通过 Origin 标头 (CORS) 进行的保护是否与通过 CSRF 令牌进行的保护一样好?
例子:
- Alice 已使用浏览器登录(使用 cookie)“https://example.com”。我假设她使用的是现代浏览器。
- Alice 访问“https://evil.com”,evil.com 的客户端代码向“https://example.com”执行某种请求(经典 CSRF 场景)。
所以:
- 如果我们不检查 Origin 标头(服务器端),并且没有 CSRF 令牌,我们就有一个 CSRF 安全漏洞。
- 如果我们检查一个 CSRF 令牌,我们是安全的(但它有点乏味)。
- 如果我们确实检查了 Origin 标头,来自 evil.com 客户端代码的请求应该被阻止,就像使用 CSRF 令牌时一样 - 除非,如果 evil.com 的代码可以以某种方式设置来源标头。
我知道,如果我们相信 W3C 规范能够在所有现代浏览器中正确实现(我们可以吗?)
但是其他类型的请求呢?表格提交?正在加载 script/img/... 标签?或者页面可以用来(合法地)创建请求的任何其他方式?或者也许是一些已知的 JS hack?
注意:我不是在谈论
- 本机应用程序,
- 被操纵的浏览器,
- example.com 页面中的跨站点脚本错误,
- ...
【问题讨论】:
-
我相信很多代理都会剥离原始标头。
-
对于表单提交和 img/script 标签,我们应该依赖 CSP,但不确定旧浏览器。
-
@thefourtheye:由于连接是通过 TLS 启动的,因此如果代理可以在他/她的中间人,那么用户将面临比 CSRF 更紧迫的问题。
-
@thefourtheye,他们为什么要剥夺
Origin?这将否定 CORS 保护。 -
我喜欢这个问题及其答案,因为它们是关于特定事物的,但它们也让我想起了 CSRF 和 CORS 之间的区别。 (我承认这些是不容易混淆的概念......但我仍然设法混淆它们。)
标签: javascript security cors csrf