使用CSP在Web Worker中启用“新功能”

时间:2013-01-20 15:43:36

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

我无法让new Function在Web Worker中工作。我有一个HTML页面,它产生了一个Web Worker。此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而无法在非沙盒中失败 - 如
    • new Worker适用于非沙箱

我的CSP如下:

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

如何让new Function在Web Worker中工作?

1 个答案:

答案 0 :(得分:5)

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

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

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