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.com和https://bar.example.com,但它可以让https://example.com一个人吗?
看看规格 ....
诸如example.com之类的主机(与主机上的任何资源匹配,无论方案如何)或*.example.com(与主机或其任何子域(及其任何子域的子域等)上的任何资源匹配,等等))
......似乎它应该允许平原https://example.com.然而,我发现几个不同的网站(网站1,站点2,站点3,站点4)是所有说,https://example.com不包括在内.这是什么?
CSP规范中引用的文字似乎是错误的,引用的其他来源是正确的.
但引用的https://www.w3.org/TR/CSP/#source-expression部分定义了CSP 源表达式,实际上并未说明相关的规范要求.
相反,实际规范性地定义相关要求的CSP规范部分是使用重定向计数算法在源中使用url匹配表达式,在https://www.w3.org/TR/CSP/#ref-for的子步骤中-grammardef-host-part-2,其内容如下:
如果表达式的host-part 的第一个字符是U + 002A ASTERISK字符(
*):
- 让剩下的是
*从表达式中删除前导" " 的结果.- 如果剩余(包括前导U + 002E FULL STOP字符(
.))不是对url主机最右边字符的ASCII不区分大小写匹配,则返回" 不匹配 ".
的包括前导U + 002E FULL STOP字符(.)的要求部分表示其余部分中的星号被移除之后包括主导句号,等等的最右边的字符url的主机也必须以匹配开始以点那.
换句话说,如果您从*.example.com算法的那一部分开始并*逐步完成,那么首先要删除.example.com作为剩余部分的get ,然后将url主机的最右边的字符与其匹配,包括前导句点.
因此https://foo.example.com匹配,因为其主机部分的最右边的字符匹配.example.com但https://example.com不匹配,因为其主机部分的最右边的字符不匹配.example.com(因为它缺少包含的句点).
2017-10-13更新
主机,例如
example.com(匹配主机上的任何资源,无论方案如何)或*.example.com(与主机子域(及其任何子域的子域等)上的任何资源匹配,等等)
请注意,读取"匹配主机或其任何子域上的任何资源"的部分现在只读"匹配主机子域上的任何资源".