【问题标题】:Loading external javascript in a Chrome Extension在 Chrome 扩展程序中加载外部 javascript
【发布时间】:2015-03-22 00:27:27
【问题描述】:

我正在尝试在我的 Chrome 扩展程序中加载一些外部 javascript 代码。但是,由于扩展的沙盒环境,我看不到外部代码定义的任何功能。

外部代码实现了一种依赖机制,一个 javascript 文件可能需要另一个,依此类推。它还查看用于加载 javascript 的 URL 的参数,以确定要加载的顶级 javascript 文件。所以它基本上可以加载任意的 web 应用程序,并且事先并不知道将要使用的所有文件。所以我不能在扩展中使用任何静态定义。

还有一个问题是,由于所有扩展代码都被沙盒化,我无法完全访问文档 - 例如,它无法访问 window 变量。

但是,如果我将所有代码都放在外部代码中,如果一个脚本尝试加载另一个脚本,我就会遇到内容安全问题。我去的全部原因是扩展程序是因为现有的每个浏览器都对 CSP 的愚蠢错误实现,因此小书签无法访问外部资源。

绕过或绕过扩展沙箱以基本上能够像页面本身已加载代码一样运行代码,而 CSP 没有任何问题的最佳做法是什么?

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension content-security-policy


    【解决方案1】:

    在内容脚本中,您可以执行类似的操作来加载 js 文件

    function inject(url, exteral) {
        // 1. Build the absolute URL
        // 2. Create a script tag and set src attribute
        // 3. Append script tag to thw window
        if (!external){
           url = chrome.extension.getURL(url);
        }
        var scriptElement = document.createElement('script');
        scriptElement.src = url;
        (document.body || document.head || document.documentElement).appendChild(scriptElement);
    }
    

    如果js文件带有扩展名,必须放在 manifest.jsonweb_accesible_resources 下。 否则它需要与注入它的页面具有相同的协议(http | https)

    由于内容脚本不允许调用窗口函数,您可以 调用window.postMessage 将数据从实际窗口发送到内容脚本。

    【讨论】:

    • 无法打包带扩展名的js文件...哪个和多少个不固定,打包会自动禁止使用最新版本。
    • 刚刚用外部url测试过,它也可以,你可以提供任何url来注入,它只需要是相同的协议。我会编辑答案。
    • 如果我创建脚本标签并将其插入到文档中,当它尝试加载其他 javascript 文件时,它会被 CSP 搞砸......
    • 我创建了一个gist,它目前正在为我工​​作
    • 现在从要点尝试创建另一个脚本标签并在同一域上为其提供第二个 URL,然后尝试从 github.com 运行扩展。 Refused to load the script 'https://localhost/test2.js' because it violates the following Content Security Policy directive: "script-src assets-cdn.github.com collector-cdn.github.com"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2016-03-16
    • 2012-01-27
    • 2012-09-19
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多