2009-10-25 10 views
6

Ahora mismo estoy jugueteando con las secuencias de comandos del usuario en Chrome, así que tenga paciencia con mi posible ignorancia/idiotez.¿Cómo puedo imitar la funcionalidad insegura de Windows de Greasemonkey/Firefox en Chrome?

En la página para la que estoy escribiendo un script, hay un elemento <script> que declara una variable x. ¿Esto significa que, en mi script de usuario, puedo acceder al x desde el espacio de nombres global?

Por ejemplo, si la única línea en mi usuario es alert(x);, ¿debería funcionar como se espera (suponiendo que x es una cadena)? Entiendo que Chrome no es compatible con ventanas inseguras, pero por alguna razón me resulta imposible averiguar cómo imitar la funcionalidad. ¿Es posible?

Respuesta

9

contentWindow estaba disponible en Chrome 3, pero removed in Chrome 4. Sólo es posible una solución para Chrome 4:

location.href="javascript:(function(){ alert('Hello'); })()" 
0

bien aquí una idea que se puede inyectar el script utilizando la barra de direcciones ...

javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm); 

continuación, puede ejecutar lo que quiera en la ventana con su javascript

+0

ah y si la variable es global para la página que debe ser capaz de leer con su javascript –

13

Esto le dará una referencia al objeto de ventana (como p):

var p = unsafeWindow; 

if(window.navigator.vendor.match(/Google/)) { 
    var div = document.createElement("div"); 
    div.setAttribute("onclick", "return window;"); 
    p = div.onclick(); 
}; 
+0

gracias, gracias – ysth

+6

No hay necesidad de "olfatear al vendedor", simplemente puedes hacer algo como esto: https://gist.github.com/1143845 –

+7

Esto no parece funcionar más en la última versión de Chrome. –

1

Si y Si desea interactuar con la página JavaScript, deberá insertar una secuencia de comandos en una página. (A menos que quiera usar cualquiera de los hacks sugeridos en esta página, por supuesto.) He creado una función para hacer exactamente eso para mis propios scripts, la publicaré aquí en caso de que alguien quiera usarla.

/* 
    @description This function will insert the given code as a <script> or <style> block into a page. 
    @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS). 
    @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'. 
    @return The HTML element that was inserted, or FALSE on failure 
*/ 
function insert(z,t){ 
    var j,f,x,c,i,n,d 
    d=document 
    c=d.createElement 
    i=d.head.appendChild 
    a=d.createTextNode 
    if(typeof z==='function') j=!0,f=!0; 
    if((t=='js'||!t)&&!f){j=!0,f=!1} 
    if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')} 
    if(j){x=c('script');x.setAttribute('type','text/javascript')} 
    if(f) n=a('('+z+')()');else n=a(z) 
    x.appendChild(n) 

    if(x){return i(x)}else{return !1} 
} 

Unos ejemplos para aclarar:

//Inserting a JavaScript function 
var func=function(){ 
    stopAds(); 
    startFileDownload(); 
} 

insert(func); 


//Inserting JavaScript as a string 
var strJS="prompt(\"Copy:\",someVariableAtThePage);"; 

insert(strJS); 
//Or with an OPTIONAL 2nd parameter: 
insert(strJS,'js'); 


//Inserting CSS 
var strCSS=".ad{display:none !important} #downloadButton{display:block}"; 

insert(strCSS,'css');//Specifying 2nd parameter as "css" is required. 
11

Actualización:
El onclick exploit ya no funciona en el último cromo libera.

Para obtener la funcionalidad de unsafeWindow en Chrome, su mejor opción es instalar y usar Tampermonkey, lo que sería inteligente para hacer, independientemente. Tampermonkey tiene soporte completo para la API de Greasemonkey y una administración de script mucho más sencilla.

Los scripts de Greasemonkey y Tampermonkey casi siempre son totalmente compatibles, algo que no es cierto para los archivos de usuario simples de Chrome.

Olvidando a Tampermonkey, la única alternativa que aún funciona es usar alguna forma de script injection.



El siguiente es ya obsoleta:

Chrome now defines unsafeWindow for userscripts/content-scripts, pero de unsafeWindow Chrome todavía no permite el acceso a los objetos creados por JS la página de destino.

Así es como para proporcionar una adecuada insegura, unsafeWindow - de una manera multi-navegador que utiliza Feature Detection (good) versus Browser Sniffing (Bad):

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist 
    (Chrome, mainly). 
    Chrome now defines unsafeWindow, but does not give it the same access to 
    a page's javascript that a properly unsafe, unsafeWindow has. 
    This code remedies that. 
*/ 
var bGreasemonkeyServiceDefined  = false; 

try { 
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") { 
     bGreasemonkeyServiceDefined = true; 
    } 
} 
catch (err) { 
    //Ignore. 
} 

if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) { 
    unsafeWindow = (function() { 
     var dummyElem = document.createElement('p'); 
     dummyElem.setAttribute ('onclick', 'return window;'); 
     return dummyElem.onclick(); 
    })(); 
} 
+0

¿esto todavía funciona? Lo probé en Chrome para anular el envío XHR, pero parece que no hace nada. Acabo de agregar: 'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function() {console.log ("notificado de actualización XHR"); oldSend.apply (esto, argumentos); } 'pero no obtengo ningún resultado durante las solicitudes. este código produce salida si lo inyecto en la página. – mix

+0

@Mix, Sí, acabo de verificar que todavía funciona en Chrome versión 18 y versión 19 (19.0.1084.56 m). Abra una nueva pregunta para su problema. –

+0

ya no funciona en Chrome – user280109

Cuestiones relacionadas