什么 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,上面写着:
嵌入式上下文:通过
iframe
、object
或embed
包含的任何资源。除非嵌入式资源是全局唯一标识符(或
srcdoc
iframe),否则嵌入式资源由随资源提供的策略控制。如果嵌入的资源是全局唯一标识符或srcdoc
iframe,它会继承创建它的上下文的策略。
“全局唯一标识符”是指带有 data:
URL 或其他非分层 URL 的 URL,例如 https
/http
URL。
因此,常见情况(问题中的“从不同域加载”)是“嵌入式资源受与资源一起交付的策略控制”的情况,即它不继承。
相比之下,如果iframe
是srcdoc
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 继承?的主要内容,如果未能解决你的问题,请参考以下文章
将 Facebook Checkbox 插件用作 iframe 小部件时出现 CSP 错误