2010-04-17 18 views
6

Tenía la impresión de que los content_scripts se ejecutaban directamente en la página, pero ahora parece como si hubiera algún sandboxing.¿Los scripts de "cromo" de la extensión Google Chrome están en la zona de pruebas?

Estoy trabajando en una extensión para registrar todo el tráfico de un sitio XHR (para la depuración y otros fines de desarrollo), y en la consola, funciona de la siguiente código de aspiración:

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

Este registra un mensaje cada vez que se envía un XHR. Cuando pongo esto en una extensión, sin embargo, el prototipo real no se modifica. Aparentemente el window.XMLHttpRequest.prototype que mi script está viendo difiere del de la página real.

¿Hay alguna forma de evitar esto? Además, ¿este comportamiento de sandboxing está documentado en alguna parte? Miré a mi alrededor, pero no pude encontrar nada.

Respuesta

6

No puede hacer eso. De acuerdo con la documentation:

Sin embargo, los scripts de contenido tienen algunas limitaciones . Ellos no pueden:

  • uso de cromo * API (a excepción de partes de chrome.extension)
  • Use variables o funciones definidas por las páginas de su extensión
  • Use variables o funciones definidas por páginas web o por otra. guiones de contenido
  • Make XMLHttpRequests entre sitios
+3

Ah, qué lástima. gracias por encontrar eso. Si solo Chrome tuviera un poco más de * potencia * en su marco de extensiones. –

+0

maldita sea. así que parece que no hay forma de interceptar y modificar los cuerpos de solicitudes http en ese momento. Desde webrequest solo se admite la modificación de los encabezados y no requestBody ... – K2xL

7

Aunque S contenido de cromo cript vive en un "mundo aislado", puedes lograr algo similar a lo que has solicitado al insertar un elemento de script en el dom.

Como prueba de concepto, he utilizado la extensión de Chrome TamperMonkey y creé este 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); 

Entonces navegado a http://s.codepen.io/boomerang/745009c49e60974cf9dba1b070f27d111458064000840/index.html que tiene esta javascript en marcha:

var secret = 'the brown fox'; 

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

Si inspecciona el consola, uno esperaría ver 'el zorro marrón' constantemente impreso, pero en cambio tenemos 'el perro azul'.


En general, creo que el concepto de seguridad que el navegador está tratando de lograr es evitar que el entorno de la página accedan entorno del script de contenido. Al darse cuenta de eso, no es sorprendente que pueda lograr algo como esto con una extensión de navegador.

+1

¡¡Buen hallazgo !! Esta debería ser la respuesta aceptada. –

+0

¡Gracias! Actualicé la URL porque parece que eliminé esa página anterior de mi sitio. –

Cuestiones relacionadas