我有一个网页(比如origin = A),其中嵌入了一个iframe,该iframe从不同的域(例如B)加载。 B从不同的域(各种CDN)加载一堆脚本。我的网页A设置了非常严格的CSP,如:
default-src' none&#39 ;; script-src' self&#39 ;; frame-src B
B没有设置任何CSP标头。
现在我希望子帧B继承A的CSP规则并尝试访问各种CDN应该违反其CSP,因为script-src' self'但令我惊讶的是,它运作顺畅。
所以我的问题是: CSP是如何由子iframe继承的?如果没有提到iframe的CSP,它是否依赖于其父框架的CSP?如果有,怎么样?有没有关于它的文件,我无法找到任何可以解释上述情况的具体内容。
有没有办法可以调试子iframe继承的CSP?来自Chrome的调试器或FF的调试器 - 选择iframe然后会显示iframe的CSP吗?
答案 0 :(得分:11)
子iframe如何继承CSP?
不是。也就是说,不是在常见情况下(问题中的“来自不同域的负载”案例)。
但是还有其他方法来填充iframe
,而CSP在这些情况下的工作方式不同(见下文)。
如果没有提到iframe的CSP,它是否依赖于其父框架的CSP?
不,它不适用于常见情况(问题中给出的“来自不同域的负载”案例)。
是否有任何关于它的文件
是的,请参阅Policy applicability section of the CSP2 specification,其中说明了这一点:
嵌入式上下文:通过
iframe
,object
或embed
包含的所有资源。除非嵌入资源是全局唯一标识符(或
srcdoc
iframe),否则嵌入资源由随资源提供的策略控制。如果嵌入资源是全局唯一标识符或srcdoc
iframe,则它会继承创建它的上下文策略。
“全球唯一标识符”包含data:
网址或其他类型的网址,而不是分层网址,例如https
/ http
网址。
因此常见的情况(在问题中描述为“来自不同域的负载”)是“嵌入式资源由随资源提供的策略控制”的情况 - 也就是说,它不会继承。
相反,如果iframe
是srcdoc
iframe,则案例非常不同而且the spec says:
每当用户代理在嵌套在受保护资源中的浏览上下文中创建
iframe srcdoc
文档时,如果用户代理强制执行受保护资源的任何策略,则用户代理必须在{{1}上强制执行这些策略。文档也是如此。
这是iframe srcdoc
iframe 继承其父级的CSP政策。