浏览器何时发送Origin标头?浏览器何时将原点设置为null?

问题描述 投票:12回答:1

this Bugzilla thread(和also)可以看出,Firefox并不总是在POST请求中发送Origin头。 The RFC表示不应该在某些未定义的“隐私敏感”环境中发送它。 Mozilla定义了那些背景here

我想知道的是,这些是Firefox不会发送Origin标头的唯一情况。据我所知它也不会发送它在跨源POST请求(虽然Chrome和IE将),但我无法在文档中确认。它是否在我遗漏的地方列举?

http firefox cors cross-domain fetch-api
1个回答
25
投票

就规范要求而言,上述问题需要分为几个答案:

  • 当浏览器必须发送Origin标头时
  • 当浏览器必须在内部将origin设置为一个将被序列化为null的值

我怀疑Firefox所需要的是什么(它与规格不同)是枚举的。但就列举规范要求而言,它们在详尽的细节中分为两部分:

当浏览器必须发送Origin标头时

问题的答案什么时候浏览器必须发送Origin标头?是:Origin标头仅针对Fetch规范定义为CORS request的任何请求发送:

CORS请求是包含Origin头的HTTP请求。它不能被可靠地识别为参与CORS协议,因为Origin头也包括在所有请求中,其方法既不是GET也不是HEAD

需要浏览器为所有请求发送actual statement in the Fetch spec头的Origin,其方法既不是GET也不是HEAD,这是:

如果设置了CORS标志或者httpRequest的方法既不是GET也不是HEAD,那么将Origin / httpRequest的origin,serialized和UTF-8编码附加到httpRequest的头列表中。

因此,这需要浏览器为所有Origin请求发送POST,包括同源POSTs(根据Fetch中的定义实际上是“CORS请求” - 即使它们是同源的)。


注意:上面描述了由于change that was made to the spec on 2016-12-09,Fetch规范当前如何定义需求。在那之前,要求是不同的:

  • 以前没有发送Origin用于同源POST
  • 之前没有从Origin(没有CORS)发送<form>用于跨源POST

所以我认为问题中描述的Firefox行为符合之前的规范,但不符合规范当前的要求。


浏览器必须发送Origin头的其他情况是使用“CORS标志”集进行请求的任何情况 - 就HTTP(S)请求而言是except when the request mode is navigate, websocket, same-origin, or no-cors

XHR始终将模式设置为cors。但是使用Fetch API,这些请求模式是您可以使用mode方法的init-object参数的fetch(…)字段设置的模式:

fetch("http://example.com", { mode: 'no-cors' }) // no Origin will be sent

除此之外,对于具有a crossorigin attribute(又名“CORS设置属性”)的任何元素,HTML规范要求浏览器将请求模式设置为cors(并发送Origin标头)。

否则,对于发起请求的任何元素(脚本,样式表,图像,媒体元素),请求的模式默认为no-cors,这意味着没有为它们发送Origin标头。

以上是有关浏览器发送Origin标头的条件的详细信息。

答案的下一部分是关于何时将原始值设置为null

当浏览器必须将origin设置为一个将被序列化为null的值

与浏览器必须发送Origin标头的要求分开的是浏览器必须将源设置为null的要求,这些要求在以下规范中定义:

HTML规范使用术语opaque origin并说:

一个内部值,没有序列化,可以从中重新创建(根据源的ASCII序列化将其序列化为“null”),唯一有意义的操作是测试相等性。

换句话说,HTML规范中的任何地方都表示不透明原点,您可以将其转换为null

HTML规范要求浏览器在以下情况下设置不透明的原点或唯一原点:

  1. Cross-origin images (including cross-origin img elements)
  2. Cross-origin media data (including cross-origin video and audio elements)
  3. Any document generated from a data: URL
  4. Any iframe with a sandbox attribute that doesn’t contain the value allow-same-origin
  5. Any document programmatically created using createDocument(), etc.
  6. Any document that does not have a creator browsing context
  7. Responses that are network errors
  8. The Should navigation response to navigation request of type from source in target be blocked by Content Security Policy? algorithm returns Blocked when executed on a navigate response

Fetch规范要求浏览器将原点设置为“全局唯一标识符”(这基本上与“不透明原点”相同,在一种情况下基本上意味着null ...):

  1. Redirects across origins

URL规范要求浏览器在以下情况下设置不透明的原点:

  1. For blob: URLs
  2. For file: URLs
  3. For any other URLs whose scheme is not one of http, https, ftp, ws, wss, or gopher

但重要的是要理解,仅仅因为浏览器内部设置了一个不透明的原点 - 本质上是null - 这并不一定意味着浏览器将发送一个Origin标头。因此,请参阅此答案的第一部分,了解有关浏览器何时必须发送Origin标头的详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.