我有一个网页(比如origin=a),其中嵌入了一个iframe,它从不同的域(比如B)加载。B从不同的域(不同的CDN)加载大量脚本。我的网页A设置了非常严格的CSP,如:
默认src'无';脚本src'自我';框架src B
B不设置任何CSP头。
现在,我希望子框架B继承A的CSP规则,并尝试访问各种CDN应该是对其CSP的违反,因为脚本src“自我”,但令我惊讶的是,它工作顺利。
所以我的问题是:CSP是如何被子iFrame继承的?如果没有提到iframe的CSP,它是否取决于其父帧的CSP?如果是,如何进行?是否有任何关于它的文件,我找不到任何具体的东西来解释上述情况。
有没有办法调试子iFrame继承的CSP?从Chrome的调试器或FF的调试器-通过选择iframe,然后显示iframe的CSP?
子iFrame如何继承CSP?
它不是——不是在常见情况下(问题中的“从不同的域加载”情况)。
但是还有其他方法来填充iframe,CSP的工作原理与之不同(见下文)。
如果没有提到iframe的CSP,它是否依赖于父帧的CSP?
不,它不适用于常见情况(问题中的“从不同域加载”情况)。
有关于它的文件吗
是的,请参阅CSP2规范的策略适用性部分,其中说:
嵌入式上下文:通过iframe
、对象
或嵌入
包含的任何资源。
除非嵌入式资源是全局唯一标识符(或srcdoc
iframe),否则嵌入式资源由随资源一起交付的策略控制。如果嵌入式资源是全局唯一标识符或srcdoc
iframe,则它将继承创建它的上下文的策略。
“全局唯一标识符”是指具有数据:
URL或其他非层次URL的URL,如https
/http
URL。
因此,常见的情况(“问题中的“从不同域加载”)是“嵌入式资源由随资源交付的策略控制”的情况,也就是说,它不继承。
相反,如果iframe
是一个srcdoc
iframe,则情况非常不同,规范中说:
每当用户代理在嵌套在受保护资源中的浏览上下文中创建一个iframe srcdoc
文档时,如果用户代理正在为受保护资源强制执行任何策略,用户代理必须在iframe srcdoc
文档上强制执行这些策略以及。
这是一个srcdoc
iframe确实继承了其父级的CSP策略。