【问题标题】:Wasm module compile error in Chrome ExtensionChrome 扩展中的 Wasm 模块编译错误
【发布时间】:2018-07-09 10:31:50
【问题描述】:

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

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

CompileError: WebAssembly.compile(): 嵌入器不允许生成 Wasm 代码。

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

【问题讨论】:

    标签: javascript google-chrome-extension webassembly


    【解决方案1】:

    我尝试了此处其他答案提供的“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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,这对我有用(ASP.NET Blazor 客户端)
      【解决方案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() 与其通信。

      【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2012-11-27
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多