让我们采用frame-ancestors指令。假设我想允许http://*.parent.com
在https://child.com
和http://child.com
加载我的网页:
frame-ancestors https://*.parent.com
我们有明显的违规行为frame-ancestors *.parent.com
,我们就会违反https://child.com
。frame-ancestors http://*.parent.com
,它适用于这两种情况。为什么?引用CSP2 spec:
- 如果源表达式的方案部分与url-scheme不区分大小写匹配,则返回不匹配。
- 如果源表达式没有方案,则如果满足以下任何条件,则返回不匹配:
醇>
- 受保护资源的URL的方案是HTTP的不区分大小写的匹配,并且url-scheme不是HTTP或HTTPS的不区分大小写的匹配
- 受保护资源的URL的方案不是HTTP的不区分大小写的匹配,并且url-scheme不是受保护资源的URL方案的不区分大小写的匹配。
我的示例中的案例2必须根据规范的条件5.2来阻塞,因为https://child.com
与HTTP不匹配,我理解。
但为什么案例3适用于https://child.com
?根据条件4,它应该失败,因为http://*.parent.com
与https://child.com
的方案不匹配。我错过了什么?
答案 0 :(得分:0)
<强>目标强>
允许http://*.parent.com
在https://child.com
和http://child.com
加载我的网页
案例3
child.com
上的CSP政策:
frame-ancestors http://*.parent.com
但为什么案例3适用于https://child.com?
如果您浏览,例如http://1.parent.com
,其中包含child.com
个内容,例如:
<iframe src="https://child.com/mycontent">
....然后child.com
会针对请求frame-ancestors
的网址检查其CSP /mycontent
表达式,即:
http://1.parent.com
与匹配的http://*.parent.com
进行比较,以便成功返回/mycontent
。
根据条件4,它应该失败,因为http://*.parent.com 与https://child.com的方案不符。我错过了什么?
听起来有点像你可能会误解frame-ancestors
。在您的示例中,不会对https://child.com
进行任何检查。该检查由 child.com
进行,将请求/mycontent
的网址与http://*.parent.com
进行比较。也许您将frame-ancestors
与frame-src
混淆了?
至于规范,我发现很难理解,但幸运的是我发现this very helpful page将其翻译成更容易理解的内容。我会引用相关的一点:
5 - 如果CSP中列入白名单的主机没有方案,则允许浏览器:
1 - 如果使用HTTP提供页面,则使用HTTP或HTTPS加载资产。
2 - 如果使用HTTPS提供页面,则使用HTTPS加载资源。
从我已经完成的所有阅读中,忽略CSP表达式中的URL方案应该隐式地允许http
和https
请求。但实际上,使用frame-ancestors
,它根本不适用于我......而且在浏览器中也是如此。
因此,我使用CSP frame-ancestors
的实践经验让我相信,为了授予对网站的访问权限,以便他们可以iframe 我的网站的内容,我需要为我的网站的CSP frame-ancestors
表达式中包含URL方案的域。
通常我会同时允许http
和https
,因此我需要,例如:
frame-ancestors http://*.parent.com https://*.parent.com