说我在mywebsite.com
上设置了此标头:
Content-Security-Policy: script-src self https://*.example.com
我知道它会允许https://foo.example.com
和https://bar.example.com
,但它会仅允许https://example.com
吗?
看the spec ....
诸如example.com之类的主机(与主机上的任何资源匹配,无论方案如何)或* .example.com(匹配主机上的任何资源或其任何一个子域(及其子域的任何子域,依此类推))
......似乎应该允许普通https://example.com
。但是,我发现了几个不同的网站(site 1,site 2,site 3,site 4)全部表示https://example.com
不包括在内。这是什么?
答案 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的子步骤中读取:
- 醇>
如果表达式的host-part的第一个字符是U + 002A ASTERISK字符(
*
):
- 让剩余成为删除前导"
*
"来自表达。- 如果剩余(包括前导U + 002E FULL STOP字符(
.
))不是最右边的ASCII不区分大小写的匹配项url
主机的字符,然后返回" 不匹配"。
包括前导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
。