【问题标题】:Are google chrome extension "content" scripts sandboxed?谷歌浏览器扩展“内容”脚本是否被沙盒化?
【发布时间】:2011-02-09 06:30:19
【问题描述】:

我的印象是 content_scripts 是直接在页面上执行的,但现在似乎正在进行一些沙盒操作。

我正在开发一个扩展来记录站点的所有 XHR 流量(用于调试和其他开发目的),并且在控制台中,以下嗅探代码有效:

 var o = window.XMLHttpRequest.prototype.open;
 window.XMLHttpRequest.prototype.open = function(){
     console.log(arguments, 'open');
     return o.apply(this, arguments);
 };
 console.log('myopen');
 console.log(window, window.XMLHttpRequest, window.XMLHttpRequest.prototype, o, window.XMLHttpRequest.prototype.open);

每次发送 XHR 时都会记录一条消息。然而,当我把它放在一个扩展中时,真正的原型并没有得到修改。显然,我的脚本看到的 window.XMLHttpRequest.prototype 与实际页面不同。

有没有办法解决这个问题?此外,这种沙盒行为是否记录在任何地方?我环顾四周,但找不到任何东西。

【问题讨论】:

    标签: javascript google-chrome xmlhttprequest sandbox


    【解决方案1】:

    你不能那样做。根据documentation

    但是,内容脚本有一些 限制。他们不能:

    • 使用 chrome.* API(chrome.extension 的部分除外)
    • 使用由其扩展页面定义的变量或函数
    • 使用网页或其他内容脚本定义的变量或函数
    • 制作跨站 XMLHttpRequests

    【讨论】:

    • 啊,真可惜。谢谢你找到那个。如果只有 chrome 在它的扩展框架中有更多的power
    • 该死的。所以看起来没有办法拦截和修改http请求体。由于 webrequest 只支持修改 headers 而不是 requestBody...
    【解决方案2】:

    虽然 Chrome 的内容脚本生活在一个“孤立的世界”中,但您可以通过将脚本元素插入 dom 来完成与您所要求的类似的事情。

    作为概念证明,我使用 TamperMonkey Chrome 扩展程序并创建了这个脚本:

    // ==UserScript==
    // @name         Modify Secret
    // @namespace    http://your.homepage/
    // @version      0.1
    // @description  enter something useful
    // @author       You
    // @match        https://*/*
    // @match        http://*/*
    // @grant        none
    // ==/UserScript==
    
    console.log(secret);
    
    var el = document.createElement('script');
    el.innerHTML = 'secret = "the blue dog"';
    document.body.appendChild(el);
    

    然后我导航到http://s.codepen.io/boomerang/745009c49e60974cf9dba1b070f27d111458064000840/index.html,它正在运行这个javascript:

    var secret = 'the brown fox';
    
    var secretPrinter = setInterval(function () {
        console.log(secret);
    }, 1000);
    

    如果您检查控制台,您会看到不断打印“棕狐”,但实际上我们看到的是“蓝狗”。


    总的来说,我认为浏览器试图实现的安全概念是防止页面环境访问内容脚本的环境。意识到这一点,您可以使用浏览器扩展来完成这样的事情也就不足为奇了。

    【讨论】:

    • 谢谢!我已经更新了 URL,因为我似乎已经从我的网站上删除了之前的页面。
    • 三年后你好,感谢您发布此消息。我应该意识到这是可能的。用它来绕过沙盒“执行环境”几乎太容易了。我用它来monkeypatch xmlhttprequest。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多