Come posso imitare la funzionalità di Windows non sicura di Greasemonkey / Firefox in Chrome?

StackOverflow https://stackoverflow.com/questions/1622145

Domanda

Sto solo scherzando con gli script utente in Chrome in questo momento, quindi per favore abbi pazienza con la mia potenziale ignoranza / idiozia.

Nella pagina per cui sto scrivendo uno script, c'è un <script> elemento che dichiara una variabile x. Questo significa che, nel mio script utente, posso semplicemente accedere a alert(x); dallo spazio dei nomi globale?

Ad esempio, se l'unica riga nel mio script utente è <=>, dovrebbe funzionare come previsto (supponendo che <=> sia una stringa)? Capisco che Chrome non supporta la finestra non sicura, ma per qualche motivo trovo impossibile capire come imitare la funzionalità. È anche possibile?

È stato utile?

Soluzione

contentWindow era disponibile in Chrome 3, ma rimosso in Chrome 4 . L'unica soluzione possibile per Chrome 4:

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

Altri suggerimenti

Questo ti 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();
};

Aggiornamento:
L'exploit onclick non funziona più nelle ultime versioni di Chrome.

Per ottenere unsafeWindow funzionalità in Chrome, la soluzione migliore è installare e utilizzare Tampermonkey - cosa che saresti intelligente da fare, indipendentemente. Tampermonkey ha il pieno supporto per l'API Greasemonkey e una gestione degli script molto più semplice.

Gli script Greasemonkey e gli script Tampermonkey sono quasi sempre completamente compatibili, cosa che non è vera per i semplici script di utenti Chrome.

Rinuncia a Tampermonkey, l'unica alternativa che funziona ancora è utilizzare una qualche forma di iniezione di script .


Quanto segue è ora obsoleto:

Chrome ora definisce <=> per script utenti / script di contenuto , ma Chrome <=> non consente ancora l'accesso agli oggetti JS creati dalla pagina di destinazione.

Ecco come fornire un messaggio non sicuro, <=> - in modo cross-browser che utilizza Rilevamento funzionalità (buono) contro Sniffing del browser (non valido) :

/*--- 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 ();
    } ) ();
}

Se vuoi interagire con la pagina JavaScript, dovrai inserire uno script in una pagina. (A meno che tu non voglia usare uno degli hack suggeriti in questa pagina, ovviamente.) Ho elaborato una funzione per fare proprio questo per i miei script, la posterò qui nel caso qualcuno volesse 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.

ok ecco un'idea che puoi iniettare lo script usando la barra degli indirizzi ...

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

allora puoi eseguire quello che vuoi nella finestra con il tuo javascript

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top