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

Wasm module compile error in Chrome Extension

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

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

CompileError: WebAssembly.compile(): Wasm code generation disallowed by embedder.

Chrome 扩展是否不支持 wasm 模块?

this issue that Chrome requires script-src: 'unsafe-eval' CSP directive be active for WebAssembly compilation. See this discussion看来,至少现在是这样。

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

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

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

However, we strongly recommend against doing this. These functions are notorious XSS attack vectors.

您可以使用文档中的以下方法对需要它的代码进行沙盒处理,而不是允许对整个扩展使用 unsafe-eval

Using eval in Chrome Extensions. Safely.

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

与其通信

Chrome implemented special policy 'wasm-eval' exclusively for apps and extensions to resolve this problem. It is chrome-specific, but slowly moving into CSP and WebAssembly 标准。只需在@Xan 的解决方案中将 'unsafe-eval' 替换为 'wasm-eval'

不过请注意,这仍然是一个攻击媒介,您有责任验证执行程序集的来源。有关此政策的示例,请参阅 uBlock's author thoughts

我尝试了此处其他答案提供的 'unsafe-eval' 和 'wasm-eval',但没有解决问题。原来它是特定于网站的。如果我在 Github 上尝试,它不起作用。但在 reddit.com 上它有效。以下是我在 Chrome 开发人员模式下看到的错误。这是针对使用 Blazor NET6 和 AOT 制作的 Chrome 扩展。希望有人觉得这有用。

CompileError: WebAssembly.instantiate(): Wasm code generation disallowed by embedder
window.Module.s.printErr @ blazor.webassembly.js:1
(anonymous) @ blazor.webassembly.js:1
async function (async)
(anonymous) @ blazor.webassembly.js:1
window.Module.s.instantiateWasm @ blazor.webassembly.js:1
createWasm @ dotnet.6.0.0.cnc7cl383g.js:1
(anonymous) @ dotnet.6.0.0.cnc7cl383g.js:1
blazor.webassembly.js:1 Uncaught (in promise) CompileError: WebAssembly.instantiate(): Wasm code generation disallowed by embedder
    at blazor.webassembly.js:1
    at async blazor.webassembly.js:1

我在 TYPO3 系统的 typo-script 中试过了,'unsafe-eval' 或 'wasm-eval' 不工作。 :-(

我在 .htaccess 中定义了它并且它有效。 :-)

<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin {linkToDomain}
Header set Access-Control-Allow-Credentials true
Header set Content-Security-Policy "default-src 'self' blob: 'unsafe-eval' 'wasm-eval'  {other code ...} ; {other code ...} script-src 'self' 'unsafe-eval' 'wasm-eval' {other code ...};   object-src 'self' 'wasm-eval';{other code ...}"
</IfModule>

P.S。 Safari 会出问题。添加 site.manifest 后,在 TypoScript od TYPO3.htaccess 中为 default-src 扩展 Content-Security-policy 似乎有效。 (见上文)

在我看来,每个浏览器的工作方式都不一样。