什么 CSP 子 iframe 从其父 iframe 继承?

Posted

技术标签:

【中文标题】什么 CSP 子 iframe 从其父 iframe 继承?【英文标题】:What CSP child iframe inherits from its parent? 【发布时间】:2017-08-31 09:20:00 【问题描述】:

我有一个网页(比如 origin=A),其中嵌入了一个 iframe,它从不同的域(比如 B)加载。 B 从不同的域(各种 CDN)加载一堆脚本。我的网页 A 设置了非常严格的 CSP,例如:

default-src '无';脚本源'自我';帧源B

B 没有设置任何 CSP 标头。

现在我希望子框架 B 继承 A 的 CSP 规则并尝试访问各种 CDN 应该违反其 CSP,因为 script-src 'self' 但令我惊讶的是,它运行顺利。

所以我的问题是: 子 iframe 如何继承 CSP?如果未提及 iframe 的 CSP,它是否取决于其父框架的 CSP?如果是,如何?是否有任何关于它的文档,我找不到任何可以解释上述情况的具体内容。

有没有办法调试子 iframe 继承的 CSP?从 Chrome 的调试器或 FF 的调试器 - 通过选择 iframe,然后 iframe 的 CSP 会出现?

【问题讨论】:

【参考方案1】:

子 iframe 如何继承 CSP?

不是——不是常见的情况(问题中的“从不同域加载”的情况)。

但是还有其他方法可以填充 iframe,而 CSP 的工作方式不同(见下文)。

如果不提及 iframe 的 CSP,是否取决于其父框架的 CSP?

不,它不适用于常见情况(问题中的“从不同域加载”情况)。

是否有任何关于它的文档

是的,请参阅Policy applicability section of the CSP2 specification,上面写着:

嵌入式上下文:通过iframeobjectembed 包含的任何资源。

除非嵌入式资源是全局唯一标识符(或srcdoc iframe),否则嵌入式资源由随资源提供的策略控制。如果嵌入的资源是全局唯一标识符或srcdoc iframe,它会继承创建它的上下文的策略。

“全局唯一标识符”是指带有 data: URL 或其他非分层 URL 的 URL,例如 https/http URL。

因此,常见情况(问题中的“从不同域加载”)是“嵌入式资源受与资源一起交付的策略控制”的情况,即它不继承。

相比之下,如果iframesrcdoc iframe,情况就大不一样了,the spec says:

每当用户代理在嵌套在受保护资源中的浏览上下文中创建 iframe srcdoc 文档时,如果用户代理正在为受保护资源执行任何策略,则用户代理必须在 iframe srcdoc 文档上强制执行这些策略:好吧。

这是一个srcdoc iframe确实继承了其父级的 CSP 策略。

【讨论】:

hmm,所以给定域 B 没有任何 CSP 标头,它的默认策略值是什么?它因浏览器而异吗?有什么方法可以知道它 - 比如从浏览器控制台或其他什么? 如果域 B 没有任何 CSP 标头,则浏览器不应用 CSP 限制并允许任何原本允许的内容——来自任何地方、任何 URL 的脚本/样式表、内联脚本/样式表、等等——以及允许浏览器通常允许的所有非分层方案。这在浏览器之间没有什么不同。如果您想考虑成为 CSP “默认策略”,那么它基本上对应于 default-src * 'unsafe-eval' 'unsafe-inline' 'unsafe-dynamic' data: filesystem: about: blob: ws: wss: 我正在做一些测试,在我看来,Edge 无论如何都会在嵌入式 iframe 上继承 frame-src/child-src。 Chrome 没有。

以上是关于什么 CSP 子 iframe 从其父 iframe 继承?的主要内容,如果未能解决你的问题,请参考以下文章

如何触发从 iframe 到其父元素的点击事件?

Iframe内部页面高度赋值于其父页面的Iframe标签

如何使 iframe 的宽度和高度与其父 div 相同?

将 Facebook Checkbox 插件用作 iframe 小部件时出现 CSP 错误

没有 src 的 iframe 的 Content-Security-Policy (CSP) 框架祖先

跨所有浏览器从 iFrame 传递消息