gpt4 book ai didi

javascript - 如何在沙盒 iframe 中创建工作人员?

转载 作者:可可西里 更新时间:2023-11-01 02:26:51 27 4
gpt4 key购买 nike

我正在构建一个用于运行不受信任代码的沙箱。出于这个原因,我创建了一个沙盒 iframe(仅在其 sandbox 属性中设置了 allow-scripts 权限)以保护来源,然后在该 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>

ma​​in.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 加载,但请求了不安全的 Worker 脚本 'blob:null/a9f2af00-47b1-45c1-874e-be4003523794'。此请求已被阻止;内容必须通过 HTTPS 提供。

我还尝试通过 https 从文件而不是 blob 加载工作代码,但这在任何地方都不允许,因为我无法从 iframe 访问同源文件。

我想知道是否有机会在不向 iframe 添加 allow-same-origin 权限的情况下在 Chrome 中使用这样的沙箱。

最佳答案

正如您所发现的,Chrome 不允许您从 https 页面访问非 https 内容(例如数据 blob),并且还会将 blob URL 视为非 https。如果没有 allow-same-origin,它就无法从任何域加载任何工作脚本文件。

我唯一的建议是从单独的 https 服务域(/子域)提供 iframe,然后同时使用 allow-scriptsallow-same-origin。由于位于单独的域中,iframe 中的代码仍然无法访问父页面的 DOM/数据。

关于javascript - 如何在沙盒 iframe 中创建工作人员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com