代码之家  ›  专栏  ›  技术社区  ›  Joe Hill

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

  •  18
  • Joe Hill  · 技术社区  · 7 年前

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

    加载模块后(至 background.html popup.html ),我捕获到编译错误:

    编译器错误:WebAssembly。compile():嵌入程序不允许生成Wasm代码。

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

    4 回复  |  直到 7 年前
        1
  •  14
  •   Xan    7 年前

    它似乎来自 this issue Chrome需要 script-src: 'unsafe-eval' CSP指令对于WebAssembly编译处于活动状态。看见 this discussion 至于为什么会这样,至少目前是这样。

    Chrome Extensions随附 default restrictions on CSP ; 包括不允许 unsafe-eval . 一些限制无法解除;在这种情况下,您 可以 允许 不安全评估 通过添加清单键:

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

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

    然而,我们强烈建议不要这样做。这些函数是臭名昭著的XSS攻击向量。

    而不是允许 不安全评估 对于整个扩展,您可以使用文档中的以下方法对需要它的代码进行沙箱处理:

    Using eval in Chrome Extensions. Safely.

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

        2
  •  12
  •   MadRunner    6 年前

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

    请注意,这仍然是一个攻击向量,您有责任验证已执行程序集的源。参见示例 uBlock's author thoughts 在这个政策上。

        3
  •  2
  •   bob craig    3 年前

    我尝试了其他答案提供的“不安全评估”和“wasm评估”,但没有解决问题。事实证明,这是特定于该网站的。如果我在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
    
        4
  •  1
  •   Padina    3 年前

    我在一个TYPO3系统上用打字脚本尝试了一下 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、 美国野生动物园制造了很多问题。添加后 site.manifest ,扩展的内容安全策略 default-src 在里面 TypoScript od TYPO3 .htaccess 这似乎奏效了。(见上文)

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