内容安全策略:frame-ancestors

9

我正在尝试将内容加载到IFrame中,因此我实现了Content-Security-Policy头部:Content-Security-Policy: frame-ancestors http://*.example.com/abc.html。

当我提供以下标头时,可以加载iframe中的内容: Content-Security-Policy: frame-ancestors http://*.example.com/。

但是当我更改标题为: Content-Security-Policy: frame-ancestors self http://*.example.com/abc.html。 然后,在刷新网页时,iframe中的内容在第一次加载时可以正常显示,但会出现以下错误:

因为祖先违反了以下Content Security Policy指令:frame-ancestors self http://*.example.com/abc.html,所以拒绝在框架中显示'https://....'。

有人能告诉我为什么在刷新页面时会出现错误吗? 另外,frame-ancestors是否考虑完整的URL(http://.example.com/abc.html)还是只考虑主机名,比如http://.example.com?


CSP frame-ancestors 只能限制框架,因此设置它不会使加载变得更容易。不清楚您在哪些页面上设置了 CSP。如果 A 框架 B,则 B 上的 frame-ancestors 将确定是否允许 A 框架内容,而仅在 A 上的 frame-ancestors 不会产生影响。您应该让您的问题更加明确。最后,它是带单引号的 "self"。 - Halvor Sakshaug
嗨@Halvor Sakshaug,感谢您的回答。 我正在尝试将A中的一些内容加载到B的iframe中。 为此,我在A服务器上设置了CSP标头,并出现了上述错误。 另外,您能否详细说明“如果A框架B”?这是否意味着B正在A的iframe中加载? - user16806836
如果"A frames B"表示网站A将网站B加载到iFrame中,则必须在网站B上设置frame-ancestors。 - Viking17
您不能在frame-ancestors中指定文件名,只允许使用URL或IP地址。Internet主机按名称或IP地址排序,以及可选的URL方案和/或端口号,用空格分隔。站点的地址可以包括一个可选的前导通配符(星号字符“”),并且您可以使用通配符(再次是“”)作为端口号,表示所有合法端口对于源都是有效的。不允许在主机周围使用单引号。 - Prabhu Thomas
2个回答

8

Chrome浏览器有一个错误 - 它不支持frame-ancestors指令中的路径。Safari也有同样的问题,只有Firefox支持在此指令中使用路径。

因此,在frame-ancestors中,你必须使用http://.example.com主机源,而非http://.example.com/abc.html
对于其他指令,您可以使用路径和文件名。


这个 bug 在 Edge Chromium 中也存在吗? - Viking17
我认为 - 是的,但我没有Edge Chromium浏览器进行真正的测试。您可以使用上面的链接测试任何浏览器。 - granty
这不是一个错误,而是根据规范,它必须是主机源、方案源、'self'或'none'。 - Halvor Sakshaug
3
由于 CSP 规范定义了 host-source 包括路径以及协议、端口号和文件名,所以这是一个 bug。另外需要注意的是,根据规范,"frame-ancestors" 不支持通配符 "*",但在实际使用中,它支持通配符。因此,规范并不总是最终的真相 - 浏览器可以按照自己的方式解释规范。 - granty
它是否列在 https://bugs.chromium.org/ 上? - Nest

1

关于此事,移除路径。使用超过方案、主机和端口不符合规范。 正如@granty所提到的 - 这是一个错误吗?或者CSP Frame Ancestors不支持路径部分? - Viking17
根据规范,它只能是主机源、方案源、'self'或'none'。不接受路径是根据规范的,因此这不是一个错误。 - Halvor Sakshaug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接