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

时间:2017-02-15 02:23:54

标签: http firefox cors cross-domain fetch-api

this Bugzilla thread(和also)可以看出,Firefox并不总是在POST请求中发送Origin标头。 The RFC声明不应将其发送到某些未定义的"隐私敏感的"上下文。 Mozilla定义了这些上下文here

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

1 个答案:

答案 0 :(得分:23)

规范所要求的内容而言,上述问题需要分为几个答案:

  • 浏览器必须发送Origin标头
  • 当浏览器必须在内部将原点设置为“null
  • 序列化的值时

我怀疑Firefox所需的内容(它与规范不同)是枚举的。但就列举 spec 要求而言,这里详细分为两部分:

当浏览器必须发送Origin标头

问题的答案浏览器何时必须发送Origin标头?Origin标头仅针对Fetch规范定义为{{3}的任何请求发送}:

  

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

要求浏览器为方法既不Origin也不GET的所有请求发送HEAD标头的CORS request是:

  

如果设置了 CORS标志 httpRequest的方法既不是GET也不是HEAD,那么追加Origin / httpRequest 的来源,序列化和UTF-8编码,到httpRequest的标题列表。

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

注意:以上介绍了由于actual statement in the Fetch spec,Fetch规范当前如何定义要求。在那之前,要求是不同的:

  • 以前没有为同源POST发送Origin
  • 以前没有从Origin(没有CORS)发送来自<form>的跨职位POST

所以我认为问题中描述的Firefox行为符合以前所需的规范,但不符合目前所需的规范。

浏览器必须发送Origin标头的其他情况是使用“CORS标志”集进行请求的任何情况 - 就HTTP(S)请求而言change that was made to the spec on 2016-12-09

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

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

除此之外,对于具有except when the request mode is navigate, websocket, same-origin, or no-cors aka “CORS设置属性)的任何元素,HTML规范要求浏览器将请求模式设置为cors(以及发送Origin标题。

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

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

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

当浏览器必须将origin设置为“将被序列化为null

的值时

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

HTML规范使用术语a crossorigin attribute并说明:

  

一个内部值,没有序列化,可以从中重新创建(它被序列化为&#34; null&#34;每个源的ASCII序列化),唯一有意义的操作是测试相等性。

换句话说,HTML规范中的每个地方都说 opaque origin ,您可以将其转换为null

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

  1. opaque origin
  2. Cross-origin images (including cross-origin img elements)
  3. Cross-origin media data (including cross-origin video and audio elements)
  4. Any document generated from a data: URL
  5. Any iframe with a sandbox attribute that doesn’t contain the value allow-same-origin
  6. Any document programmatically created using createDocument(), etc.
  7. Any document that does not have a creator browsing context
  8. Responses that are network errors
  9. Fetch规范要求浏览器将原点设置为“全局唯一标识符”(在一种情况下,它基本上与“不透明原点”相同,基本上意味着null ...):

    1. 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
    2. 在以下情况下,URL规范要求浏览器设置不透明的原点:

      1. Redirects across origins
      2. For blob: URLs
      3. For file: URLs
      4. 但重要的是要理解,因为浏览器内部设置了一个不透明的来源 - 实质上是null - 这并不一定意味着浏览器会发送Origin标头。因此,请参阅此答案的第一部分,详细了解浏览器何时必须发送Origin标题。