Chrome扩展程序中的Wasm模块编译错误

时间:2018-01-30 13:52:53

标签: javascript google-chrome-extension webassembly

在我的扩展中,我想使用自己的WebAssembly模块。

加载我的模块(到background.htmlpopup.html)后,我发现了编译错误:

  

CompileError:WebAssembly.compile():embedder不允许生成代码。

Chrome扩展程序不支持wasm模块吗?

2 个答案:

答案 0 :(得分:3)

似乎this issue Chrome要求script-src: 'unsafe-eval' CSP指令对WebAssembly编译有效。请参见this discussion至少为何情况,至少目前为止。

Chrome扩展程序附带default restrictions on CSP;包括不允许unsafe-eval。有些限制无法取消;在这种情况下,可以通过添加清单密钥来允许unsafe-eval

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

这应该足以测试Wasm是否在扩展中工作。但请注意文档中的这个警告:

  

但是,我们强烈建议不要这样做。这些函数是臭名昭着的XSS攻击向量。

不是允许unsafe-eval用于整个扩展程序,而是可以使用文档中的以下方法对需要它的代码进行沙箱化:

Using eval in Chrome Extensions. Safely.

它的要点是在您的扩展程序中创建一个单独的页面,其中允许unsafe-eval但不允许使用Chrome API访问;然后,您将此页面嵌入到您的扩展程序中,并使用postMessage()与其进行通信。

答案 1 :(得分:0)

Chrome implemented special policy 'wasm-eval'专用于应用程序和扩展程序来解决此问题。它是特定于铬的,但逐渐进入CSPWebAssembly标准。只需在@Xan的解决方案中将'unsafe-eval'替换为'wasm-eval'

但是请注意,这仍然是一种攻击手段,您有责任验证已执行程序集的来源。例如,请参见uBlock's author thoughts,了解该政策。