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

时间:2017-06-30 15:58:05

标签: javascript html security content-security-policy

说我在mywebsite.com上设置了此标头:

Content-Security-Policy: script-src self https://*.example.com

我知道它会允许https://foo.example.comhttps://bar.example.com,但它会仅允许https://example.com吗?

the spec ....

  

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

......似乎应该允许普通https://example.com。但是,我发现了几个不同的网站(site 1site 2site 3site 4全部表示https://example.com不包括在内。这是什么?

2 个答案:

答案 0 :(得分:5)

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

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

相反,实际规范性地定义相关要求的CSP规范部分是Does url match expression in origin with redirect count算法,在https://www.w3.org/TR/CSP/#ref-for-grammardef-host-part-2的子步骤中读取:

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

         
        
    1. 剩余成为删除前导" *"来自表达
    2.   
    3. 如果剩余(包括前导U + 002E FULL STOP字符(.))不是最右边的ASCII不区分大小写的匹配项   url主机的字符,然后返回" 不匹配"。
    4.   
  2.   

包括前导U + 002E FULL STOP字符(.部分要求表示删除星号后的剩余部分包括前导完全停止,因此url的主机最右边的字符也必须以点开头才能匹配。

换句话说,如果您从*.example.com开始并浏览算法的这一部分,则首先删除*以获取.example.com 剩余 part,然后你匹配url主持人最右边的字符,包括领先的句号。

因此https://foo.example.com匹配,因为其主机部分的最右侧字符与.example.com匹配,但https://example.com不匹配,因为其主机部分的最右侧字符不匹配{ {1}}(因为它缺少包含的句号)。

2017-10-13更新

使用CSP规范返回I reported the problem并且now been fixed

relevant part of the CSP spec现在显示为:

  

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

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

答案 1 :(得分:0)

根据Mozilla's docs,如果您想要包含基本域,则应在CSP标头中加入'self'*.example.com