2010-04-17 9 views
6

Ho avuto l'impressione che i content_scripts siano stati eseguiti direttamente sulla pagina, ma ora sembra che ci sia del sandboxing in corso.Gli script di "contenuto" dell'estensione google chrome sono in modalità sandbox?

sto lavorando su un'estensione per registrare tutto il traffico XHR di un sito (per altri scopi di sviluppo e debugging), e nella console, il seguente codice funziona annusare:

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

Questo registra un messaggio ogni volta che viene inviato un XHR. Quando inserisco questa estensione, tuttavia, il vero prototipo non viene modificato. Apparentemente il window.XMLHttpRequest.prototype che il mio script sta vedendo differisce da quello della pagina reale.

C'è un modo per aggirare questo? Inoltre, questo comportamento sandboxing è documentato ovunque? Mi sono guardato intorno, ma non ho trovato nulla.

risposta

6

Non puoi farlo. Secondo il documentation:

Tuttavia, gli script contenuti hanno alcune limitazioni . Essi non possono:

  • utilizzare Chrome * API (tranne che per le parti di chrome.extension)
  • Utilizzare variabili o funzioni definite dalle pagine del loro estensione
  • Utilizzare le variabili o funzioni definite da pagine web o con altri. script di contenuti
  • Trucco XMLHttpRequests cross-site
+3

Ah che vergogna. grazie per averlo trovato Se solo Chrome avesse un po 'più di * potenza * nella sua struttura di estensioni. –

+0

dannazione. quindi sembra che non ci sia modo di intercettare e modificare i corpi delle richieste http allora. Poiché webrequest supporta solo la modifica delle intestazioni e non il requestBody ... – K2xL

7

Anche se Chrome Content S cript vive in un "mondo isolato", potresti realizzare qualcosa di simile a quello che hai richiesto inserendo un elemento di script nel dom.

Come una prova di concetto, ho usato il Chrome Extension TamperMonkey e creato questo script:

// ==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); 

Poi ho navigato a http://s.codepen.io/boomerang/745009c49e60974cf9dba1b070f27d111458064000840/index.html che ha questo correre javascript:

var secret = 'the brown fox'; 

var secretPrinter = setInterval(function() { 
    console.log(secret); 
}, 1000); 

Se si controlla il console, ci si aspetterebbe di vedere "la volpe marrone" costantemente stampata, ma invece abbiamo "il cane blu".


In generale, penso che il concetto di sicurezza che il browser sta cercando di raggiungere è quello di evitare che l'ambiente della pagina di accedere all'ambiente dello script contenuti. Comprendendo ciò, non sorprende che tu possa realizzare qualcosa di simile con un'estensione del browser.

+1

Nice find !! Questa dovrebbe essere la risposta accettata. –

+0

Grazie! Ho aggiornato l'URL poiché sembra che abbia rimosso quella pagina precedente dal mio sito. –

Problemi correlati