Origin头的存在是否意味着CORS请求

时间:2017-01-31 20:09:29

标签: http-headers cors httprequest

假设带有Origin头的HTTP请求是CORS请求是否安全?

如果没有,区分CORS请求和来自外部服务器上的PHP应用程序的常规HTTP请求的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果“CORS请求”是指跨域请求 - 即。使用the CORS protocol的请求 - 然后不,假设带有Origin标头的HTTP请求是跨源请求是不安全的。

这是因为,同时要求浏览器在使用CORS协议的所有跨源请求中发送Origin the Fetch spec also requires browsers to send the Origin header for all requests whose method is neither GET nor HEAD

  

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

因此,浏览器还必须发送Origin标头,例如,所有POST个请求。

获取规范further states

  

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

因此规范实际上将 CORS请求定义为“具有Origin标头的任何请求” - ,即使该请求未使用the CORS protocol 。这似乎是一种奇怪的定义方式,但无论如何,重要的是要记住规范提到 CORS请求的其他任何地方,它并不一定意味着“参与CORS协议的请求” - 因为根据规范中的上述定义,同源POST请求也是一个CORS请求

因此,从服务器端无法确定地将给定请求标识为参与CORS协议。只有发送请求的浏览器知道 - 而Origin以外,没有其他标头我们可以假设浏览器总是在CORS协议请求中发送。