Chrome将Origin标头添加到同源请求
Posted
技术标签:
【中文标题】Chrome将Origin标头添加到同源请求【英文标题】:Chrome adding Origin header to same-origin request 【发布时间】:2013-03-08 21:14:56 【问题描述】:我们正在向本地运行的服务器发布 AJAX 请求,即
xhr.open("POST", "http://localhost:9000/context/request");
xhr.addHeader(someCustomHeaders);
xhr.send(someData);
这个 javascript 正在执行的页面也是从 localhost:9000 提供的,也就是说,这看起来完全像一个同源请求。
但是,由于某种原因,谷歌浏览器总是在结果请求中设置一个 Origin 标头,导致我们的服务器基于错误假设它是 CORS 请求而阻止该请求。
这在 Firefox 中不会发生。
此外,Firefox 和 Chrome 都没有发送 OPTIONS 预检请求,这令人困惑;为什么在没有预先检查的情况下设置 Origin 标头以确保服务器允许 Origin 和 Custom 标头?
有谁知道这种情况下发生了什么?我们是否误解了 CORS 规范?
【问题讨论】:
请参阅seclab.stanford.edu/websec/csrf/csrf.ppt,它回答了为什么 Origin 标头适用于同源 POST 请求。是一种CSRF保护机制。 【参考方案1】:Chrome 和 Safari 在同源 POST/PUT/DELETE 请求中包含 Origin
标头(同源 GET 请求将没有 Origin 标头)。 Firefox 在同源请求中不包含 Origin
标头。浏览器不希望同源请求上有 CORS 响应标头,因此对同源请求的响应将发送给用户,无论它是否具有 CORS 标头。
我建议检查 Host
标头,如果它与 Origin
标头中的域匹配,则不要将请求视为 CORS。标题看起来像这样:
Host: example.com
Origin: http://example.com
请注意,Origin
将有方案 (http/https)、域和端口,而 Host
将只有域和端口。
【讨论】:
这很有意义 - 我们将相应地更改 CORS 过滤器。谢谢!【参考方案2】:根据 RFC 6454 - Web Origin 概念 - 对于任何 HTTP 请求(包括同源请求),Origin 的存在实际上都是合法的:
https://www.rfc-editor.org/rfc/rfc6454#section-7.3
"用户代理可以在任何 HTTP 中包含一个 Origin 头字段 请求。”
【讨论】:
以上是关于Chrome将Origin标头添加到同源请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 couchDB 中添加 cors - 请求的资源上不存在“Access-Control-Allow-Origin”标头
Chrome S3 Cloudfront:初始和加载请求上没有“Access-Control-Allow-Origin”标头
使用 Chrome/WebKit 调试 Access-Control-Allow-Origin