2010-04-17 90 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