2010-04-17 56 views
6

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

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

回答

6

你不能那样做。根据documentation

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

  • 使用Chrome *的API(除了chrome.extension的部分)由它们的扩展的页面定义
  • 使用变量或函数
  • 使用变量或函数通过网页或通过其他定义。内容脚本
  • 进行跨网站XMLHttpRequests
+3

啊,真是太遗憾了。感谢您的发现。如果只有chrome在它的扩展框架中有更多* power *的话。 – 2010-04-18 23:02:43

+0

该死的。所以看起来好像没有办法拦截和修改http请求体。由于webrequest只支持修改标题,而不是requestBody ... – K2xL 2014-01-20 05:20:07

7

虽然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); 

控制台,人们会期望看到'棕色狐狸'不断印刷,但相反,我们有'蓝色的狗'。


在一般情况下,我认为浏览器尝试实现安全理念是为了防止页面的环境访问内容脚本的环境。意识到这一点并不奇怪,你可以用浏览器扩展来完成这样的事情。

+1

不错的发现!这应该是被接受的答案。 – 2015-03-28 14:42:06

+0

谢谢!我已经更新了网址,因为我似乎已从我的网站中删除了上一页。 – 2016-03-15 17:48:06