【发布时间】:2023-03-24 20:07:01
【问题描述】:
我正在构建一个沙箱来运行不受信任的代码。出于这个原因,我创建了一个沙盒 iframe(在其 allow-scripts 属性中仅设置了 allow-scripts 权限)以保护来源,然后在该 iframe 中我创建了一个 web-worker 以确保一个单独的线程并防止冻结主应用程序,以防不受信任的代码有无限循环。
问题是,如果我尝试通过 https 加载沙箱,最近的谷歌浏览器不允许创建工作人员。在其他浏览器上它可以工作,如果我通过 http 在 Chrome 中加载沙箱,它也可以工作。
代码如下:
index.html:
<!DOCTYPE html>
<html>
<head>
<title>Sandbox test</title>
<script type="text/javascript" src="main.js"></script>
</head>
<body></body>
</html>
main.js:
// determining absolute path of iframe.html
var scripts = document.getElementsByTagName('script');
var url = scripts[scripts.length-1].src
.split('/')
.slice(0, -1)
.join('/')+'/iframe.html';
window.addEventListener("load", function() {
var iframe = document.createElement('iframe');
iframe.src = url;
iframe.sandbox = 'allow-scripts';
iframe.style.display = 'none';
document.body.appendChild(iframe);
window.addEventListener('message', function(e) {
if (e.origin=='null' && e.source == iframe.contentWindow) {
document.write(e.data.text);
}
});
}, 0);
iframe.html:
<script src="iframe.js"></script>
iframe.js:
var code = 'self.postMessage({text: "sandbox created"});';
var url = window.URL.createObjectURL(
new Blob([code], {type: 'text/javascript'})
);
var worker = new Worker(url);
// forwarding messages to parent
worker.addEventListener('message', function(m) {
parent.postMessage(m.data, '*');
});
演示:
http://asvd.github.io/sandbox/index.html - http 演示(适用于任何地方)
https://asvd.github.io/sandbox/index.html - https 演示(不适用于 Chrome)
https://github.com/asvd/asvd.github.io/tree/master/sandbox - 来源(与此问题中的内联完全相同)
谷歌浏览器随后抱怨:
混合内容:“https://asvd.github.io/sandbox/iframe.html”处的页面通过 HTTPS 加载,但请求了不安全的 Worker 脚本“blob:null/a9f2af00-47b1-45c1-874e-be4003523794”。此请求已被阻止;内容必须通过 HTTPS 提供。
我还尝试通过 https 从文件而不是 blob 加载工作代码,但这在任何地方都是不允许的,因为我无法从 iframe 访问同源文件。
我想知道是否有机会在 Chrome 中制作这样的沙盒,而不向 iframe 添加allow-same-origin 权限。
【问题讨论】:
标签: javascript iframe sandbox web-worker