Access-Control-Allow-Origin标头必须包含方案吗?

时间:2015-03-03 18:55:12

标签: http cors

我对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响应头中包含该端口号,无论是否有该方案?

1 个答案:

答案 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序列化。

由于same-origin policy

,这一点尤其重要
  

同源政策是安全的基石之一      许多用户代理,包括Web浏览器。

关于端口号问题的第二部分,ASCII serialization of an origin algorithm州:

  
      
  1. 如果原点三元组的端口部分不同于      协议的默认端口,由方案部分给出      起源三联:

         
        
    1. 添加U + 003A COLON代码点(&#34;:&#34;)和给定端口,      基数十,结果。
    2.   
  2.