2009-10-25 6 views
6

Sono solo trafficando con gli script utente in cromo in questo momento, quindi per favore abbiate pazienza con il mio potenziale ignoranza/idiozia.Come posso imitare la funzionalità Windows sicuro di Firefox di Greasemonkey/Firefox in Chrome?

Nella pagina in cui sto scrivendo uno script, c'è un elemento <script> che dichiara una variabile x. Questo significa che, nel mio script utente, posso solo accedere x dal namespace globale?

Ad esempio, se l'unica riga nel mio userscript è alert(x);, dovrebbe funzionare come previsto (supponendo che x sia una stringa)? Capisco che Chrome non supporta la non segretezza, ma per qualche motivo trovo impossibile capire come imitare la funzionalità. È possibile?

risposta

9

contentWindow era disponibile in Chrome 3, ma removed in Chrome 4. Solo possibile soluzione per Chrome 4:

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

ok heres un'idea si può iniettare lo script utilizzando la barra degli indirizzi ...

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

allora è possibile eseguire quello che vuoi nella finestra con il javascript

+0

Oh, e se la variabile è globale per la pagina che dovrebbe essere in grado di leggere con il vostro javascript –

13

Questo vi darà un riferimento all'oggetto finestra (come p):

var p = unsafeWindow; 

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

grazie grazie grazie – ysth

+6

Non c'è bisogno di "fiutare il venditore", si può semplicemente fare qualcosa del genere: https://gist.github.com/1143845 –

+7

Questo non sembra funzionare più nell'ultimo versione di Chrome. –

1

Se y vuoi interagire con la pagina JavaScript, dovrai inserire uno script in una pagina. (A meno che non si desidera utilizzare uno dei hack proposti in questa pagina, naturalmente.) Ho cucinato una funzione di fare proprio questo per i miei propri script, mi post qui nel caso qualcuno vuole usarlo.

/* 
    @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} 
} 

Alcuni esempi per chiarire:

//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

Aggiornamento:
Il onclick exploit non funziona più nel più recente Chrome rilascia.

Per ottenere la funzionalità unsafeWindow in Chrome, la soluzione migliore è installare e utilizzare Tampermonkey - che si sarebbe in grado di fare, a prescindere. Tampermonkey ha il pieno supporto per l'API Greasemonkey e una gestione degli script molto più semplice.

script di Greasemonkey e script Tampermonkey sono quasi sempre pienamente compatibili, qualcosa che non è vero per userscripts Chrome pianura.

Rinunciando Tampermonkey, l'unica alternativa che funziona ancora è quello di utilizzare una qualche forma di script injection.



Quello che segue è ormai obsoleto:

Chrome now defines unsafeWindow for userscripts/content-scripts, ma di unsafeWindow Chrome ancora non consente l'accesso agli oggetti JS creati dalla pagina di destinazione.

Ecco come fornire un corretto non sicuri, unsafeWindow - in maniera cross-browser che utilizza 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

funziona ancora? l'ho provato in chrome per sovrascrivere l'invio XHR, ma sembra che non faccia nulla. Ho appena aggiunto: 'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function() {console.log ("notificato dell'aggiornamento XHR"); oldSend.apply (this, arguments); } 'ma non ottengo output durante le richieste. questo codice produce output se lo inserisco nella pagina. – mix

+0

@Mix, Sì, ho appena verificato che funzioni ancora su Chrome versione 18 e versione 19 (19.0.1084.56 m). Apri una nuova domanda per il tuo problema. –

+0

non funziona più con il cromo – user280109