谷歌浏览器扩展程序中的“content”脚本是否被隔离?

8

我曾经认为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与实际页面不同。有什么方法可以解决这个问题吗?此外,这种沙盒行为在哪里有文档记录?我找了一下,但没找到任何信息。
2个回答

9
尽管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。 - 190290000 Ruble Man
你好,来自三年后的问候,感谢您发布这篇文章。我应该意识到这是可能的。使用这种方法绕过沙盒“执行环境”几乎太容易了。我用它来猴子补丁XMLHttpRequest。 - swyx

8

您无法这样做。根据文档

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

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

3
啊,真可惜。感谢你找到了那个问题。如果Chrome浏览器的扩展框架能再强一点就好了。 - Jared Forsyth
该死。看起来没有办法拦截和修改HTTP请求体了。因为Web请求仅支持修改标头而不是请求正文... - K2xL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接