6

我在new Function在Web Worker中工作时遇到问题。我有一个产生Web Worker的HTML页面。该Web Worker通过new Function(str)执行代码。我试图在打包的Chrome应用中使用此功能,该功能需要使用类似eval的代码在清单中明确列为沙盒页面。使用CSP在Web Worker中启用“新功能”

现在,有两种选择:

  • 名单将沙箱的页面。如果我这样做,我可以使用new Function,但我无法派生Web Worker,因为我无法提出任何请求(沙盒页面具有唯一的来源)。 new Worker(...)会抛出一个SECURITY_ERR
    • new Function由于独特的产地作品沙箱
    • new Worker在沙箱中失败
  • 不要列表被沙盒的页面。如果我这样做了,我可以派生出一个Web Worker,但工作人员不能使用new Function,因为它不是沙箱。抱怨使用它new Function(...)抛出EvalError
    • new Function非沙盒失败,因为在非沙箱是eval
    • new Worker作品

我CSP如下:

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

我能做得到new Function在网络工作者?

回答

5

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

  • 创建包含的源代码的工人的Blob对象
  • 将其转换为一个“dataurl”
  • 与此dataurl

此实例化工人与示例代码描述在他们的WebWorkers tutorial中的HTML5岩石网站。这样您可以将网站列为沙箱,但由于不需要执行外部请求,因此它也应该在沙盒模式下工作。

+0

事实证明'data:'URL不起作用,因为同源问题,但来自blob(来自文章)的'createObjectURL' URL起作用。将整个工作脚本嵌入主页面并不是很方便,但它似乎是实现它的唯一方法。谢谢。 – pimvdb

+0

哦,我现在可以看到,我在回答中使用了数据url而不是对象url,对此抱歉。你也许可以做一个构建步骤来使它更方便。 – molnarg