我有一些问题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
Run Code Online (Sandbox Code Playgroud)
至少,我想我已经理解正确了.
在IETF 还表示,访问控制允许来源标题的格式必须遵循相同的格式.来自http://www.w3.org/TR/cors/#access-control-allow-origin-response-header:
Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
Run Code Online (Sandbox Code Playgroud)
和链接到Origin标题页面.
但是,我已经看到很多例子(这里都在SO和其他地方)显示没有方案的ACAO标题(即不是Origin标题的精确"镜像"),例如,它们表明在请求中传递了这个:
Origin: http://www.example.com
Run Code Online (Sandbox Code Playgroud)
这是'正确'的回应:
Access-Control-Allow-Origin: www.example.com
Run Code Online (Sandbox Code Playgroud)
那么ACAO标题有效吗?我认为ACAO标头必须是Origin标头值(或'*'或'null')的精确镜像.
如果我使用不包含该方案的ACAO标题进行响应,用户代理是否应该接受它?或者它是在UA-by-UA的基础上?如果Origin包含端口号怎么办?我是否需要在ACAO响应头中包含该端口号,无论是否有该方案?
正如您所提到的,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 ]
Run Code Online (Sandbox Code Playgroud)
和CORS W3C推荐明确指的是相同的定义.
Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
Run Code Online (Sandbox Code Playgroud)
因此以下标头无效
Access-Control-Allow-Origin: www.example.com
Run Code Online (Sandbox Code Playgroud)
并且不得被用户代理接受
生成Origin头字段时,用户代理必须满足以下要求:
语法中的每个序列化原点产品必须是原点的ascii序列化.
由于同源政策,这一点尤为重要:
同源策略是许多用户代理(包括Web浏览器)的安全基石之一.
关于端口号码问题的第二部分,原始算法的ASCII序列化说明:
如果origin三元组的端口部分与origin三元组的scheme部分给出的协议的默认端口不同:
- 将U + 003A COLON代码点(":")和给定端口(基数为10)附加到结果.
| 归档时间: |
|
| 查看次数: |
2173 次 |
| 最近记录: |