如何在沙盒框架中创建工作线程
How to create a worker in a sandboxed iframe?
我正在构建一个运行不受信任代码的沙箱。出于这个原因,我创建了一个沙盒iframe(在其sandbox
属性中仅具有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 -来源(与本题内联的完全相同)
Google Chrome然后抱怨:
混合内容:页面'https://asvd.github.io/sandbox/iframe.html'是通过HTTPS加载的,但请求了一个不安全的工作脚本'blob:null/a9f2af00-47b1-45c1-874e-be4003523794'。此请求已被阻止;
我还尝试通过https从文件而不是blob加载工作代码,但这在任何地方都是不允许的,因为我不能从iframe访问相同来源的文件。
我想知道是否有机会在Chrome中制作这样的沙盒工作,而不添加allow-same-origin
权限到iframe。
正如您所发现的,Chrome不会让您从https页面访问非https内容(如数据blob),并且还将blob url视为非https。如果没有allow-same-origin
,它就不能从任何域加载任何工作脚本文件。
我唯一的建议是让iframe从一个单独的https服务域(/子域)服务,然后有allow-scripts
和allow-same-origin
。由于在一个单独的域上,iframe中的代码仍然无法访问父页面的DOM/数据。
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 第一次点击动态创建的表后,点击不工作
- 我怎样才能让jQuery即使在尚未创建的对象上也能工作
- 如何在jquery中为object键创建一个工作变量以避免额外的代码
- Rails Production-可以工作,但不能编辑/删除/创建记录
- 在Alfresco中动态创建空间/文件夹的Javascript;t工作正确
- 是否有可能在 threejs 中创建一个工作的计算机界面
- 角度指令和属性Don'在控制器内创建和设置时无法工作
- 存储创建工作,存储定义不工作
- 为不在javascript中工作的动态创建类设置属性
- 我正在尝试创建一个可以在Internet Explorer(Windows 10,又名Edge)中工作的html语音到文
- 在Meteor中,我如何创建一个跨所有模板工作的通用事件处理程序
- 谷歌工作表中用于获取条目和创建日历事件的脚本示例
- 主页键和结束键don'在页面上创建弹出窗口时无法工作
- 为谷歌工作表创建一个自定义函数
- webkitAudioContext在iOS Safari上创建MediaElementSource不工作
- Excelljs - 如何从流创建工作表
- 怎么反对.用JavaScript创建工作
- 如何重新创建工作scrollspy示例
- 如何在沙盒框架中创建工作线程