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

Chrome 扩展中的 Origin 标头

spring security CORS 过滤器允许没有“Origin”标头的请求

如何解决请求的资源上没有“Access-Control-Allow-Origin”标头