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

时间:2017-04-05 16:20:47

标签: javascript html iframe content-security-policy

我有一个网页(比如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吗?

1 个答案:

答案 0 :(得分:11)

  

子iframe如何继承CSP?

不是。也就是说,不是在常见情况下(问题中的“来自不同域的负载”案例)。

但是还有其他方法来填充iframe,而CSP在这些情况下的工作方式不同(见下文)。

  

如果没有提到iframe的CSP,它是否依赖于其父框架的CSP?

不,它不适用于常见情况(问题中给出的“来自不同域的负载”案例)。

  

是否有任何关于它的文件

是的,请参阅Policy applicability section of the CSP2 specification,其中说明了这一点:

  

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

     

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

“全球唯一标识符”包含data:网址或其他类型的网址,而不是分层网址,例如https / http网址。

因此常见的情况(在问题中描述为“来自不同域的负载”)是“嵌入式资源由随资源提供的策略控制”的情况 - 也就是说,它不会继承。

相反,如果iframesrcdoc iframe,则案例非常不同而且the spec says

  

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

这是iframe srcdoc iframe 继承其父级的CSP政策。