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

12
我假设这只是规范的一个简单误解。然而,我在包含受沙盒保护的iFrames中的脚本方面遇到了问题。具体来说,我正在处理的代码如下。
在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',因为它违反了以下内容安全策略指令:"script-src localhost:9000"。

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

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


这在Firefox中也是一样的。 - mems
1个回答

12
当您使用具有唯一起源的沙盒页面时,无法在CSP中放置没有方案的主机,因此违反了策略。使用 script-src https://example.comscript-src http://example.com 或甚至是 script-src https://example.com http://example.com,CSP将正确地放宽(请注意,默认情况下CSP是基于白名单的,大多数内容都被禁止)。

正如CSP规范中的语法所示,CSP指令中的方案是可选的:

; 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与重定向次数匹配表达式吗? 给定一个URL(url),一个源表达式(expression),一个起始点(origin)和一个数字(redirect count),该算法返回“匹配”,如果url与expression匹配,否则返回“不匹配”。
...
3. 如果expression符合host-source语法: - 如果url的主机为空,则返回“不匹配”。 - 如果expression没有scheme-part,则除非满足以下条件之一,否则返回“不匹配”: - origin的方案是url的方案 - origin的方案是“http”,而url的方案是“https”,“ws”或“wss”之一。 - origin的方案是“https”,而url的方案是“wss”。
在给定的例子中:
  • origin的方案是null(因为使用了sandbox而没有使用allow-same-origin)。
  • urlhttp://example.com/script.js
null源的方案不符合最后三种情况中的任何一种,因此不带方案的主机名不会匹配任何URL,因此违反了策略。

哇 - 我真是太傻了。非常感谢您的帮助。我想我只是参考了 MDN 上没有方案的 CSP 示例。 - jhleath
1
@huntaub 仔细想了一下,我错了。规范允许省略方案(因为它在方括号内,这意味着该标记是可选的)。更有可能的是规范没有被正确遵守,即浏览器存在漏洞。你能取消接受我的答案吗?然后我会删除它。 - Rob W
是的 - 我可以取消接受你的答案,但我暂时不会删除它。它对于弄清楚为什么这不起作用很有用。 - jhleath
你认为我应该向Chromium提交一个错误报告吗? - jhleath
1
首先检查是否真的是一个错误,而不是我们中的疏忽,然后创建一个最小化测试用例,然后将其发布在http://crbug.com/new上。 - Rob W
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接