我对CORS定义有一些问题,我有一个问题(一般不是关于CORS - 我很好 - 只是关于官方规范和用法):
根据IETF,如果传递了Origin标头,并且它是URL,则该URL必须完全序列化,并且必须包括scheme和host(以及可选的端口)。来自http://tools.ietf.org/html/rfc6454#section-7.1:
The Origin header field has the following syntax:
origin = "Origin:" OWS origin-list-or-null OWS
origin-list-or-null = %x6E %x75 %x6C %x6C / origin-list
origin-list = serialized-origin *( SP serialized-origin )
serialized-origin = scheme "://" host [ ":" port ]
; <scheme>, <host>, <port> from RFC 3986
至少,我认为我已正确理解。
IETF 也表示Access-Control-Allow-Origin标头的格式必须遵循相同的格式。来自http://www.w3.org/TR/cors/#access-control-allow-origin-response-header:
Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
并链接到Origin标题页。
但是,我已经看到很多例子(这里都在SO和其他地方)显示了ACAO标题没有方案(即不是Origin标题的精确&#39;镜像) ,例如他们表示这是在请求中传递的:
Origin: http://www.example.com
这是正确的&#39;响应:
Access-Control-Allow-Origin: www.example.com
那么ACAO标题是否有效?我认为ACAO标题必须是Origin标题值的精确镜像(或者&#39; *&#39;或者&#39; null&#39;)。
如果我回复了不包含该方案的ACAO标题,用户代理是否应接受该标题?或者它是在UA-by-UA的基础上?如果Origin包含端口号怎么办?我是否需要在ACAO响应头中包含该端口号,无论是否有该方案?
答案 0 :(得分:7)
正如您所提到的,RFC 6454定义了原点的语法而没有歧义:
origin = "Origin:" OWS origin-list-or-null OWS
origin-list-or-null = %x6E %x75 %x6C %x6C / origin-list
origin-list = serialized-origin *( SP serialized-origin )
serialized-origin = scheme "://" host [ ":" port ]
和CORS W3C recommandation明确指出相同的定义。
Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
因此以下标题无效
Access-Control-Allow-Origin: www.example.com
用户代理不得接受和
,这一点尤其重要生成Origin头字段时,用户代理必须满足 以下要求:
语法中的每个序列化原创作品必须是 原产地的ascii序列化。
同源政策是安全的基石之一 许多用户代理,包括Web浏览器。
关于端口号问题的第二部分,ASCII serialization of an origin algorithm州:
- 醇>
如果原点三元组的端口部分不同于 协议的默认端口,由方案部分给出 起源三联:
- 添加U + 003A COLON代码点(&#34;:&#34;)和给定端口, 基数十,结果。