什么时候Firefox在POST请求中将Origin标头设置为null?

P J*_*nes 12 firefox http cross-domain cors fetch-api

正如你可以看到从这个Bugzilla的线程(和),Firefox不总是在POST请求发送Origin标.RFC规定不应在某些未定义的"隐私敏感"上下文中发送它.Mozilla 在这里定义了这些上下文.

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

谢谢.

sid*_*ker 27

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

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

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

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

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

CORS请求是包括一个HTTP请求Origin报头.它不能被可靠地识别为参与CORS协议,因为Origin对于方法既不是GET也不是的所有请求也包括头HEAD.

Fetch规范中的实际语句要求浏览器Origin为其方法既不是GET也不HEAD是这样的所有请求发送标头:

如果设置了CORS标志或者httpRequest的方法既不GETHEAD,也将Origin/ httpRequest的原始序列化和UTF-8编码附加到httpRequest的头列表中.

因此,需要浏览器发送Origin所有 POST请求,包括同源POST秒(根据定义在取实际上是"CORS请求" -甚至虽然他们同源).


注意:以上描述了Fetch规范当前如何定义需求,原因是2016-12-09对规范进行了更改.在那之前,要求是不同的:

  • 之前没有Origin发送同一个来源的POST
  • 以前没有Origin从一个<form>(没有CORS)发送跨来源POST

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


当浏览器必须发送的其他情况下Origin报头是其中请求与"CORS标志"所做的任何情况下,设置其中,据HTTP(S)请求是除了请求模式navigate,websocket,same-origin,或no-cors.

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

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

伴随于此,对于具有任何元件一个crossorigin属性(又名 "CORS设置属性),HTML规范要求的浏览器,以请求模式设置为cors(和发送Origin报头).

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

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

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

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

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

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

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

换句话说,HTML规范到处都是不透明的原点,你可以将其转换为null.

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

  1. 交叉原始图像(包括交叉原始img元素)
  2. 跨领域媒体数据(包括跨源videoaudio元素)
  3. data:URL 生成的任何文档
  4. iframe具有sandbox不包含值的属性的任何一个allow-same-origin
  5. 以编程方式创建的任何文档createDocument()等.
  6. 任何没有创建者浏览上下文的文档
  7. 响应是网络错误
  8. 是否应导航响应于从目标源类型的导航请求由内容安全策略被阻止?算法返回在导航响应上执行时阻止

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

  1. 重定向来自原点

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

  1. 对于blob:URL
  2. 对于file:URL
  3. 对于其他任何网址,其方案是不是一个http,https,ftp,ws,wss,或gopher.

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


and*_*otn 5

对我来说,这是在超标准表单 POST 到本地主机上的相对 URL 上发生的,并且似乎是通过

<meta name="referrer" content="no-referrer">
Run Code Online (Sandbox Code Playgroud)

在里面<head>

将其更改为

<meta name="referrer" content="same-origin">
Run Code Online (Sandbox Code Playgroud)

似乎让 Firefox 更快乐。