在我的扩展中,我想使用自己的WebAssembly模块。
加载我的模块(到background.html
或popup.html
)后,我发现了编译错误:
CompileError:WebAssembly.compile():embedder不允许生成代码。
Chrome扩展程序不支持wasm模块吗?
答案 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'专用于应用程序和扩展程序来解决此问题。它是特定于铬的,但逐渐进入CSP和WebAssembly标准。只需在@Xan的解决方案中将'unsafe-eval'
替换为'wasm-eval'
。
但是请注意,这仍然是一种攻击手段,您有责任验证已执行程序集的来源。例如,请参见uBlock's author thoughts,了解该政策。