Manifest V3版Chrome扩展沙箱中运行WebAssembly出现编译错误如何解决
问题描述
我正在尝试让一个包含WebAssembly的库在Manifest V3版本的Chrome扩展中运行,相关配置和遇到的问题如下:
- 我准备了名为
sandbox.html的基础文件,其中执行如下JavaScript代码:
if (typeof WebAssembly === "object" && typeof WebAssembly.instantiate === "function") { const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00)); }
- 我通过以下标签将该页面嵌入到父页面中:
<iframe sandbox="allow-same-origin allow-scripts" csp="script-src 'self' 'unsafe-eval'; object-src 'self'" src="sandbox.html"> </iframe>
- 因为需要使用
allow-same-origin权限,我没有在manifest.json中添加sandbox或content_security_policy配置 - 运行时触发如下报错:
Uncaught CompileError: WebAssembly.Module(): Wasm code generation disallowed by embedder
- 已尝试的操作均无法解决问题:
- 用
wasm-eval替代unsafe-eval - 在
manifest.json中配置不含allow-same-origin的content_security_policy,同时不配置sandbox字段
- 用
解决方案
你遇到的问题核心是Chrome扩展Manifest V3的默认内容安全策略(CSP)优先级高于iframe上的csp属性,默认禁止所有动态代码生成包括WebAssembly,iframe上的csp属性只能新增限制,无法放宽扩展层面的CSP规则,你需要补全以下配置:
- 在
manifest.json中新增扩展级的content_security_policy配置,放开WebAssembly执行权限:
{ "manifest_version": 3, // 其他扩展配置保持不变 "content_security_policy": { "extension_pages": "script-src 'self' 'unsafe-eval' 'wasm-eval'; object-src 'self'" } }
- 如果你不需要使用普通的
eval能力,只需要WebAssembly运行权限,可以删除配置中的'unsafe-eval',仅保留'wasm-eval'即可获得更高的安全性,该配置在Chrome 103及以上版本均支持。 - 不需要修改你现有的iframe配置,也不需要在
manifest.json中新增sandbox字段,可以保留allow-same-origin权限满足你的业务需求。
内容的提问来源于stack exchange,提问作者Bentley Carr
相关产品推荐
相关产品推荐

