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 与实际页面的不同。

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

4

2 回答 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);

如果您检查控制台,您会期望看到不断打印的“棕狐”,但我们却看到了“蓝狗”。


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

于 2015-01-13T21:34:46.233 回答
8

你不能这样做。根据文档

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

  • 使用 chrome.* API(chrome.extension 的部分除外)
  • 使用由其扩展页面定义的变量或函数
  • 使用由网页或其他内容脚本定义的变量或函数
  • 制作跨站 XMLHttpRequests
于 2010-04-18T22:02:15.360 回答