内容安全策略框架-祖先
Posted
技术标签:
【中文标题】内容安全策略框架-祖先【英文标题】:content security policy frame-ancestors 【发布时间】:2021-10-31 04:27:54 【问题描述】:我正在尝试将我的内容加载到 IFrame 中,因此我实现了 Content-Security-Policy 标头:Content-Security-Policy: frame-ancestors http://*.example.com/abc.html。
当我将标题指定为时,我可以在 iframe 上加载内容 内容安全策略:框架祖先 http://*.example.com/。
但是当我将标题更改为: 内容安全策略:框架祖先自我 http://*.example.com/abc.html。 然后 iframe 上的内容是第一次加载,但是当我刷新网页时出现以下错误
拒绝在框架中显示“https://....”,因为祖先违反了以下内容安全策略指令:frame-ancestors self http://*.example.com/abc.html。
谁能告诉为什么它在刷新页面时出错。 框架祖先也考虑完整的 url (http://.example.com/abc.html) 还是只考虑主机名,如 http://.example.com?
【问题讨论】:
CSP frame-ancestors 只能限制成帧,所以设置它不会使它更容易加载。目前尚不清楚您在哪些页面上设置了 CSP。如果 A 框架 B,则 B 上的框架祖先将确定是否允许 A 框架内容,而仅 A 上的框架祖先将没有影响。你应该让你的问题更清楚。最后是带单引号的 'self'。 嗨 Halvor,感谢您的回答。 嗨@Halvor Sakshaug,感谢您的回答。我正在尝试将 A 中的一些内容加载到 B 的 iframe 中。为此,我在 A 的服务器上设置了 CSP 标头并收到上述错误。你也可以详细说明'如果A框架B'吗?这是否意味着 B 正在 A 的 iframe 上加载? 是的,如果 A 框架 B 意味着站点 A 正在将站点 B 加载到 iFrame 中。必须在站点 B 上设置框架祖先。 您不能在 frame-ancestors 中指定文件名.. 只允许 URL 或 IP 地址.. Internet 主机的名称或 IP 地址,以及可选的 URL 方案和/或端口号,用空格隔开。该站点的地址可能包含一个可选的前导通配符(星号字符,''),并且您可以使用通配符(同样,'')作为端口号,表示所有合法端口都适用于来源。不允许在主机周围加上单引号。 【参考方案1】:Chrome 浏览器有一个 bug - 它不支持 frame-ancestors
指令中的路径。 Safari 也存在同样的 bug,并且只有 Firefox 支持此指令中的路径。
所以对于frame-ancestors
而不是http://.example.com/abc.html
,您必须使用http://.example.com
主机源。
对于其他指令,您可以使用路径和文件名。
【讨论】:
Edge Chromium 中是否也存在此错误? 我认为 - 是的,但我没有用于实际测试的 Edge Chromium 浏览器。您可以使用上面的链接测试任何浏览器。 不是bug,按照规范,必须是host-source,scheme-source,'self'或者'none。 这是一个错误,因为 CSP 规范定义了 host-source including the paths 以及方案、端口号和文件名。另请注意,根据规范,frame-ancestors
不支持通配符*
,但在现实生活中它支持它。因此,规范并不总是最终的事实——浏览器可以用自己的方式解释它。【参考方案2】:
如果没有工作示例,很难确切知道问题出在哪里。但根据规范https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors,可以建议对您的 CSP 进行一些调整:
去掉路径,多用scheme、host、port是不符合规范的。 使用预期的方案 (http/https) 或删除该方案。 使用通配符 https://*.example.com,而不仅仅是 https://.example.com 使用“自我”,而不是自我【讨论】:
关于去掉路径,多用scheme、host、port是不符合规范的。正如@granty 所提到的 - 那么这是一个错误吗?还是 CSP 框架祖先不支持路径部分? 正如规范所说,它只能是主机源、方案源、'self'或'none'。不接受路径是根据规范,所以这不是错误。以上是关于内容安全策略框架-祖先的主要内容,如果未能解决你的问题,请参考以下文章
尝试渲染 iframe:祖先违反了以下内容安全策略指令:“frame-ancestors 'none'”
拒绝框架'https://api.xxx.jp/',因为它违反了以下内容安全策略指令:“frame-src'self'