具有内容安全策略的 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.com
或script-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 不会在 iOS10 中加载内容
尝试渲染 iframe:祖先违反了以下内容安全策略指令:“frame-ancestors 'none'”