具有内容安全策略的 iFrame 沙盒

Posted

技术标签:

【中文标题】具有内容安全策略的 iFrame 沙盒【英文标题】:iFrame Sandbox with Content Security Policy 【发布时间】:2014-08-16 03:03:48 【问题描述】:

我认为这只是对规范的简单误解。但是,我在将脚本包含在受沙盒保护的 iFrame 中时遇到了问题。具体来说,我正在处理的代码如下。

在top.html中:

<iframe src="framed.html" sandbox="allow-scripts"></iframe>

在 framed.html 中

...
<head>
  <meta http-equiv="Content-Security-Policy" content="script-src example.com">
  <script src="http://example.com/script.js"></script>
</head>
...

在 Chrome 中运行此文件时,它给了我错误:

拒绝加载脚本“http://example.com/script.js”,因为 它违反了以下内容安全政策指令: “脚本源本地主机:9000”。

为什么会阻止脚本加载?我知道没有allow-same-origin,iFrame 将获得一个完全独特的来源,它不等于任何其他来源。因此,script-src 'self' 不起作用。但是,我正在尝试从 CSP 中明确要求的来源加载脚本。想法?

更新:创建JSFiddle 来展示问题。

【问题讨论】:

火狐也一样 【参考方案1】:

当您使用具有唯一来源的沙盒页面时,您不能在 CSP 中放置没有方案的主机,这就是违反政策的原因。使用script-src https://example.comscript-src http://example.com 甚至script-src https://example.com http://example.com,CSP 将正确放宽(请注意,CSP 是基于白名单的,默认情况下大多数情况都是不允许的)。


正如the grammar from the CSP specification 所示,CSP 指令中的方案是optional:

; Schemes: "https:" / "custom-scheme:" / "another.custom-scheme:"
scheme-source = scheme-part ":"

; Hosts: "example.com" / "*.example.com" / "https://*.example.com:12/path/to/file.js"
host-source = [ scheme-part "://" ] host-part [ port-part ] [ path-part ]
scheme-part = scheme
              ; scheme is defined in section 3.1 of RFC 3986.
host-part   = "*" / [ "*." ] 1*host-char *( "." 1*host-char )
host-char   = ALPHA / DIGIT / "-"
port-part   = ":" ( 1*DIGIT / "*" )
path-part   = path-abempty
              ; path-abempty is defined in section 3.3 of RFC 3986.

但是没有allow-same-origin 标记的沙盒框架将具有null 来源,并且 URL 匹配算法不允许无方案指令匹配(算法的相关部分如下所示):

6.6.1.6. url 是否匹配 origin 中的表达式和重定向计数?

给定一个 URL (url)、一个源表达式 (expression)、一个来源 (origin) 和一个数字 (redirect count),如果 url 匹配 expression,此算法返回“Matches”,否则返回“Does Not Match”。

...

    如果表达式匹配host-source语法:

      如果 url 的主机是null,则返回“Does Not Match”。

      如果表达式没有scheme-part,则返回“Does Not Match”,除非满足以下条件之一:

        origin 的方案是 url 的方案 origin 的方案是“http”,url 的方案是“https”、“ws”或“wss”之一. origin 的方案是“https”,url 的方案是“wss”。

在给定的例子中:

origin的方案是null(因为使用sandbox而没有allow-same-origin)。 网址http://example.com/script.js

null 源的方案与最后三种情况都不匹配,因此没有方案的主机名将无法匹配任何 URL,因此违反了政策。

【讨论】:

哇——我真是太傻了。非常感谢帮忙。我想我只是在示例on MDN 显示没有该方案的 CSP。 @huntaub 再想一想,我错了。规范允许省略该方案(因为它位于方括号内,即means that the token is optional)。似乎更有可能没有正确遵守规范,即浏览器错误。你能不接受我的回答吗?那我就删了。 是的 - 我不能接受你的回答,虽然 - 我还不会删除它。它有助于找出为什么这不起作用。 你认为我应该向 Chromium 提交错误报告吗? 首先检查它是否真的是一个错误,而不是我们的疏忽,然后创建一个最小的测试用例,然后将其发布到crbug.com/new。

以上是关于具有内容安全策略的 iFrame 沙盒的主要内容,如果未能解决你的问题,请参考以下文章

设置 iframe 的内容安全策略?

内容安全策略框架祖先。 iframe 不会在 iOS10 中加载内容

尝试渲染 iframe:祖先违反了以下内容安全策略指令:“frame-ancestors 'none'”

内容安全策略框架-祖先

由于内容安全策略,无法在Iframe中加载BIRT报告的图像

内容安全策略拒绝列出白名单