【问题标题】:How to create a worker in a sandboxed iframe?如何在沙盒 iframe 中创建工作人员?
【发布时间】: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>

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 - 来源(与此问题中的内联完全相同)

谷歌浏览器随后抱怨:

混合内容:“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


    【解决方案1】:

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

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

    【讨论】:

    • 这适用于一次性解决方案,但我维护一个库 (github.com/asvd/jailed) - 因此我试图在不让用户拥有单独域的情况下找到解决方案。
    猜你喜欢
    • 2022-01-07
    • 2014-03-02
    • 2011-09-12
    • 2013-06-06
    • 2012-11-27
    • 2014-07-25
    • 2015-01-19
    • 2017-06-19
    • 2017-12-23
    相关资源
    最近更新 更多