【问题标题】:Enable 'new Function' in a Web Worker with CSP使用 CSP 在 Web Worker 中启用“新功能”
【发布时间】:2013-01-20 15:43:35
【问题描述】:

我无法让new Function 在 Web Worker 中工作。我有一个生成 Web Worker 的 HTML 页面。这个 Web Worker 通过new Function(str) 执行代码。我正在尝试在打包的 Chrome 应用程序中使用它,该应用程序需要使用类似 eval 的代码的页面在清单中明确列为沙盒页面。

现在,有两种选择:

  • 不要列出要沙盒化的页面。如果这样做,我可以使用new Function,但我无法生成 Web Worker,因为我无法发出任何请求(沙盒页面具有唯一的来源)。 new Worker(...) 抛出 SECURITY_ERR
    • new Function 在沙盒中工作
    • new Worker 由于唯一来源而在沙箱中失败
  • 不要列出要沙盒化的页面。如果这样做,我可以生成一个 Web Worker,但该 Worker 不能使用 new Function,因为它没有被沙盒化。 new Function(...) 抛出 EvalError 抱怨使用它。
    • new Function 由于是 eval-like 而在非沙盒中失败
    • new Worker 在非沙盒中工作

我的 CSP 如下:

sandbox allow-scripts script-src 'self' 'unsafe-eval'; object-src 'self'

我该怎么做才能让new Function 在 Web Worker 中工作?

【问题讨论】:

    标签: javascript google-chrome web-worker content-security-policy function-constructor


    【解决方案1】:

    有一种称为内联工作者的技术,我建议使用它。

    • 创建一个包含 worker 源代码的 Blob 对象
    • 将其转换为“dataurl”
    • 使用此 dataurl 实例化工作人员

    这在 HTML5 Rocks 网站的WebWorkers tutorial 中使用示例代码进行了描述。这样您就可以将站点列为沙盒,但由于不需要执行外部请求,它也应该在沙盒模式下工作。

    【讨论】:

    • 事实证明,data: URL 由于同源问题而不起作用,但来自 blob(来自文章)的 createObjectURL URL 确实有效。将整个工作脚本内联到主页面不是很方便,但它似乎是让它工作的唯一方法。谢谢。
    • 哦,我现在可以看到我在答案中使用了数据 url 而不是对象 url,对此感到抱歉。您也许可以做一个构建步骤以使其更方便。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多