CORS 和 Origin 标头?

Posted

技术标签:

【中文标题】CORS 和 Origin 标头?【英文标题】:CORS and Origin header? 【发布时间】:2013-04-05 23:34:15 【问题描述】:

当我们需要调用 Ajax 请求时:

if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
else

    var versions = ["Microsoft.XmlHttp",
            "MSXML2.XmlHttp",
            "MSXML2.XmlHttp.3.0",
            "MSXML2.XmlHttp.4.0",
            "MSXML2.XmlHttp.5.0"
    ];

我已经知道使用XMLHttpRequest-2,我们可以进行跨域请求AND添加ORIGIN标头。

问题:

什么时候添加了这个标题?

是否在浏览器(支持 CORS)执行请求时添加? (跨域还是非跨域?) 还是在浏览器“看到”请求目标来源与当前来源不同时自动添加...

我的意思是:He** 是什么意思?

跨域 HTTP 请求有一个 Origin 标头。这个标题 向服务器提供请求的来源。这个标题是 受浏览器保护,不能从应用程序代码中更改。 本质上,它是找到的原始属性的网络等价物 关于跨文档消息传递中使用的消息事件。原始标头 与较旧的referer [sic] 标头的不同之处在于,referer 是一个 完整的 URL,包括路径。因为路径可能包含 敏感信息,浏览器有时不会发送引用 试图保护用户隐私。 但是,浏览器将始终 必要时发送所需的 Origin 标头

【问题讨论】:

关于 CORS 使用和 Internet Explorer 的说明:caniuse.com/#search=cors 当源的唯一区别是端口时,IE 和 Origin 标头中也存在错误:***.com/a/20784210/1268003 【参考方案1】:

Origin 标头

何时添加此标头?

在标头阶段,文档正文发送之前(open 之后,send 之前)。

它是在浏览器(支持 CORS)发出请求时添加的吗? (跨域还是非跨域?)

当源与创建XMLHttpRequest的页面不匹配时添加,但也可以在同源请求中发送。

或者当浏览器“看到”请求目标来源与当前来源不同时是否自动添加...

是的。

但是,浏览器总是会在必要时发送所需的 Origin 标头。

这是 XMLHttpRequest 规范的一部分;如果您正在发出跨域请求,则会在请求标头中发送一个额外的标头。这个标题是例如Origin: http://www.***.com 并由遵循标准的浏览器附加,无需用户交互。


您可以在MozillaWiki's Security sectionWHATWGhtml5.org 中阅读有关规范的更多信息。它是由(据我所知)FireFox 和 Google Chrome 实现的。我不相信它是 W3C 的一部分。此外不要假设源头是真的,因为它可以通过修改后的浏览器或其他软件手动设置。

【讨论】:

@RoyiNamir 我重新阅读了规范并重新措辞了第二个答案以允许这样做,因为规范没有详细提及它。不过,我以前从未见过这种情况,并且不会依赖 html5rocks.com 作为浏览器实现规范的主要来源。 对于那些在为缺少 Origin 标头而摸不着头脑的人来说,听起来 intent 总是发送一个,但是对于这(大约在 2019 年初),这仍然是under discussion。 我明白为什么“不要假设原始标头是真实的”,但在那种情况下,如果我们不能信任它,为什么它还有用呢? @PEZO 它被伪造的风险是否重要/是否值得取决于您的用例。 99.999...% 的时间您的用户将提供真实数据,那么这 0.000...1% 的时间是否会导致安全风险?如果您不使用它来授予对安全事物的访问权限,则可能不必担心。如果您使用它来获取流量来源的指标以规划营销预算,这可能不是问题。 @Paul S 谢谢!【参考方案2】:

当您进行跨域请求时(通常)会自动添加源头。

为了测试它,我在此页面上打开了控制台并发出了两个不同的请求:一个用于另一个域,一个用于“/”,而第一个请求添加了原始标头。

顺便说一句,我正在使用 JQuery,我真的建议你也使用它,以便跨浏览器具有相同的行为。

有关该主题的补充信息,请查看:

首先要注意的是,一个有效的 CORS 请求总是包含 一个 Origin 标头。这个 Origin 头是浏览器添加的,可以 不受用户控制。这个头的值就是scheme (例如 http)、域(例如 bob.com)和端口(仅当它是 不是默认端口,例如81) 请求的来源;为了 例如:http://api.alice.com。

Origin 标头的存在并不一定意味着 request 是一个跨域请求。虽然所有跨域请求 将包含一个 Origin 标头,一些同源请求可能有 一个也是。例如,Firefox 不包含 Origin 标头 同源请求。但是 Chrome 和 Safari 包含一个 Origin 标头 在同源 POST/PUT/DELETE 请求上(同源 GET 请求将 没有 Origin 标头)。

Source

【讨论】:

以上是关于CORS 和 Origin 标头?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 服务器在收到“Origin: null”标头时应该做啥? (CORS)

放大:即使在 API 网关和 Lambda 标头中启用了 CORS,但 CORS 标头“Access-Control-Allow-Origin”缺失错误

Cors Policy No Access-Control-Allow-Origin' 标头

CORS“不存在'Access-Control-Allow-Origin'标头”但有

原因:缺少 CORS 标头“Access-Control-Allow-Origin”

Internet Explorer 11 不在 CORS 请求中添加 Origin 标头?