当 HTTP 服务器接收到 "Origin: null" header 时,它应该做什么? (CORS)

What is an HTTP server expected to do when it receives an "Origin: null" header? (CORS)

Origin header 的定义说:

origin-or-null  = origin / %s"null" ; case-sensitive

"null"是不是要像域名一样管理?换句话说,服务器可以在使用 "null" 时接受请求(至少在某些情况下)还是一直被认为是故障?

我在 Fetch Documentation 中寻找解释,但到目前为止我还没有找到这个具体问题的答案。

通过发送 Origin: null header,浏览器表明请求来自 opaque origin。也就是说,浏览器向作为服务器维护者的您发出信号,表明请求不是以典型方式从实际 运行 在网络上使用 Ajax 方法或 Fetch 或 XHR 的应用程序发起的调用您的服务器 — 因此它可能不是您实际打算让您的服务支持的用例。

所以你一般不想在响应Origin: null请求时发送Access-Control-Allow-Origin响应header。换句话说,您希望浏览器阻止任何前端 JavaScript 代码访问您为此类请求发回的响应。

虽然 most-common 浏览器将 Origin header 设置为 null 的情况可能是当前端代码从某人的本地文件系统 运行 时(来自 file:// URL,而不是来自 Web 服务器)——在许多其他情况下,浏览器也会将 Origin header 设置为 null。有关详尽列表,请参阅 https://whosebug.com/a/42242802/441757.

https://w3c.github.io/webappsec-cors-for-developers/#avoid-returning-access-control-allow-origin-null 解释了您应该如何看待此类情况:

It may seem safe to return Access-Control-Allow-Origin: "null" , but the serialization of the Origin of any resource that uses a non-hierarchical scheme (such as data: or file:) and sandboxed documents is defined to be "null". Many User Agents will grant such documents access to a response with an Access-Control-Allow-Origin: "null" header, and any origin can create a hostile document with a "null" Origin. The "null" value for the ACAO header should therefore be avoided.

换句话说,如果您有意允许前端使用来自服务器的响应,您可能认为为 Origin: null 请求发回 Access-Control-Allow-Origin 会很有用 JavaScript code 运行ning 在某人的本地文件系统上(例如,对于某人进行本地测试)。但是通过这样做,您将不仅允许 local-filesystem 情况,而且还允许 https://whosebug.com/a/42242802/441757 中描述的所有其他情况。全有或全无。