asv*_*svd 11 javascript iframe sandbox web-worker
我正在构建一个用于运行不受信任代码的沙箱.出于这个原因,我创建了一个沙盒iframe(它只allow-scripts在其sandbox属性中设置了权限)以保护原点,然后在iframe中我创建一个web-worker来确保一个单独的线程并防止冻结主应用程序以防万一例如,不受信任的代码具有无限循环.
问题是,如果我尝试通过https加载沙箱,则最近的Google Chrome不允许创建工作人员.在其他浏览器上它可以工作,如果我通过http在Chrome中加载沙箱也可以.
这是代码:
index.html的:
<!DOCTYPE html>
<html>
<head>
<title>Sandbox test</title>
<script type="text/javascript" src="main.js"></script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
Iframe.html的:
<script src="iframe.js"></script>
Run Code Online (Sandbox Code Playgroud)
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, '*');
});
Run Code Online (Sandbox Code Playgroud)
演示:
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 - source(完全如此问题中的内联)
谷歌Chrome然后抱怨:
混合内容:" https://asvd.github.io/sandbox/iframe.html "上的页面是通过HTTPS加载的,但是请求了一个不安全的工作人员脚本'blob:null/a9f2af00-47b1-45c1-874e-be4003523794'.此请求已被阻止; 内容必须通过HTTPS提供.
我还试图通过https从文件而不是blob加载工作程序代码,但这在任何地方都是不允许的,因为我无法从iframe访问相同来源的文件.
我想知道是否有机会在Chrome中使这样的沙箱工作,而无需添加allow-same-originiframe权限.
正如您所发现的,Chrome 不允许您从 https 页面访问非 https 内容(例如数据 blob),并且还将 blob URL 视为非 https。如果没有allow-same-origin,它就无法从任何域加载任何工作脚本文件。
我唯一的建议是让 iframe 从单独的 https 服务域 (/subdomain) 提供服务,然后同时拥有allow-scripts和allow-same-origin. 由于位于单独的域中,iframe 中的代码仍然无法访问父页面的 DOM/数据。