代码之家  ›  专栏  ›  技术社区  ›  Jared Forsyth appas

谷歌浏览器扩展“内容”脚本沙盒?

  •  6
  • Jared Forsyth appas  · 技术社区  · 15 年前

    在我的印象中,内容脚本是在页面上执行的,但现在似乎有一些沙箱正在进行。

    我正在开发一个扩展来记录站点的所有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与实际页面的不同。

    有办法解决这个问题吗?而且,这种沙箱行为在任何地方都有记录吗?我环顾四周,什么也找不到。

    2 回复  |  直到 9 年前
        1
  •  6
  •   Mohamed Mansour    15 年前

    你不能那样做。根据 documentation :

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

    • 使用chrome.*api(chrome.extension的部分除外)
    • 使用由其扩展页定义的变量或函数
    • 使用由网页或其他内容脚本定义的变量或函数
    • 生成跨站点xmlhttprequests
        2
  •  8
  •   Andrew Drozdov    9 年前

    尽管chrome的内容脚本生活在一个“孤立的世界”中,但是您可以通过在dom中插入一个script元素来完成类似的任务。

    作为概念证明,我使用了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);
    

    如果你检查控制台,人们会期望看到'棕色狐狸'不断印刷,但我们有'蓝狗'。


    一般来说,我认为浏览器试图实现的安全概念是防止页面的环境访问内容脚本的环境。意识到这一点,使用浏览器扩展可以完成这样的任务并不奇怪。