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

相關問題