内容安全策略标头的*.example.com是否也与example.com匹配?

Ano*_*uin 9 html javascript security content-security-policy

说我已设置此标头mywebsite.com:

Content-Security-Policy: script-src self https://*.example.com
Run Code Online (Sandbox Code Playgroud)

我知道这将允许https://foo.example.comhttps://bar.example.com,但它可以让https://example.com一个人吗?

看看规格 ....

诸如example.com之类的主机(与主机上的任何资源匹配,无论方案如何)或*.example.com(与主机或其任何子域(及其任何子域的子域等)上的任何资源匹配,等等))

......似乎它应该允许平原https://example.com.然而,我发现几个不同的网站(网站1,站点2,站点3,站点4)是所有说,https://example.com不包括在内.这是什么?

sid*_*ker 7

CSP规范中引用的文字似乎是错误的,引用的其他来源是正确的.

但引用的https://www.w3.org/TR/CSP/#source-expression部分定义了CSP 源表达式,实际上并未说明相关的规范要求.

相反,实际规范性地定义相关要求的CSP规范部分是使用重定向计数算法在源中使用url匹配表达式,https://www.w3.org/TR/CSP/#ref-for的子步骤中-grammardef-host-part-2,其内容如下:

  1. 如果表达式的host-part 的第一个字符是U + 002A ASTERISK字符(*):

    1. 剩下的*表达式中删除前导" " 的结果.
    2. 如果剩余(包括前导U + 002E FULL STOP字符(.))不是对url主机最右边字符的ASCII不区分大小写匹配,则返回" 不匹配 ".

包括前导U + 002E FULL STOP字符(.)的要求部分表示其余部分中的星号被移除之后包括主导句号,等等的最右边的字符url的主机也必须以匹配开始以点那.

换句话说,如果您从*.example.com算法的那一部分开始并*逐步完成,那么首先要删除.example.com作为剩余部分的get ,然后将url主机的最右边的字符与其匹配,包括前导句点.

因此https://foo.example.com匹配,因为其主机部分的最右边的字符匹配.example.comhttps://example.com不匹配,因为其主机部分的最右边的字符不匹配.example.com(因为它缺少包含的句点).


2017-10-13更新

前段时间我报告了 CSP规范的问题,现在已经修复了.

CSP规范相关部分现在为:

主机,例如example.com(匹配主机上的任何资源,无论方案如何)或*.example.com(与主机子域(及其任何子域的子域等)上的任何资源匹配,等等)

请注意,读取"匹配主机或其任何子域上的任何资源"的部分现在只读"匹配主机子域上的任何资源".