我想在沙箱页面中加载一些外部脚本,然后在事件页面上使用消息传递与沙箱页面进行通信以使用这些脚本。我基本上遵循这两个文件:
https://developer.chrome.com/extensions/sandboxingEval https://developer.chrome.com/extensions/manifest/sandbox
这是我在沙盒和事件页面配置中使用的 manifest.json :
{
"manifest_version": 2,
"name": "Diver",
"description": "Diver",
"version": "0.0.1",
"devtools_page": "devtools.html",
"minimum_chrome_version" : "57",
"background": {
"page": "eventpage.html",
"persistent": false
},
"sandbox": {
"pages": ["sandbox.html"]
}
}
这是 eventpage.html ,它会在iframe中加载sandbox.html:
<!doctype html>
<html>
<body>
<iframe id="sandboxFrame" src="sandbox.html"></iframe>
</body>
</html>
这是 sandbox.html ,它会加载外部脚本:
<!doctype html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.2.3/ajv.min.js"></script>
</head>
<body>
</body>
</html>
当我尝试它时,我收到一条错误,说内容安全策略阻止了外部脚本的加载。因此根据文档看起来不允许这样做:
“从第57版开始,Chrome将不再允许沙盒中的外部网页内容(包括嵌入式框架和脚本)。请使用网页浏览”
“此外,您指定的CSP可能不允许在沙盒页面中加载外部Web内容。”
该文档要求我使用webview,但webview仅适用于Chrome应用。接下来,我将sandbox.html上传到cdn并将其替换为eventpage.html:
<!doctype html>
<html>
<body>
<iframe id="sandboxFrame" src="https://www.somecdn.com/sandbox.html"></iframe>
</body>
</html>
此时加载外部脚本,可能是因为该外部页面没有CSP阻止脚本。
我不明白为什么在扩展名中使用sandbox.html时会阻止相同的脚本,但是当从外部域加载sandbox.html时却不会。我知道这是因为CSP,但为什么Chrome决定以这种方式阻止它。我在Chrome 56中测试了它并没有阻止它。只有在Chrome 57之后它才被阻止。