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 似乎有效。 (见上文)
在我看来,每个浏览器的工作方式都不一样。
在我的扩展中,我想使用我自己的 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 似乎有效。 (见上文)
在我看来,每个浏览器的工作方式都不一样。