2009-10-25 9 views
6

Po prostu bawię się teraz skryptami użytkownika w chrome, więc proszę o moją potencjalną ignorancję/idiotyzm.Jak mogę naśladować niebezpieczną funkcjonalność przeglądarki Greasemonkey/Firefox w przeglądarce Chrome?

Na stronie, na której piszę skrypt, znajduje się element <script>, który deklaruje zmienną x. Czy to oznacza, że ​​w moim skrypcie użytkownika mogę uzyskać dostęp do x z globalnej przestrzeni nazw?

Na przykład, jeśli jedyną linią w moim userpadzie jest alert(x);, to powinno działać zgodnie z oczekiwaniami (zakładając, że x to ciąg)? Rozumiem, że chrome nie obsługuje unsafewindow, ale z jakiegoś powodu nie mogę znaleźć sposobu naśladowania funkcjonalności. Czy to możliwe?

Odpowiedz

9

contentWindow był dostępny w przeglądarce Chrome 3, ale removed in Chrome 4. Jedynym możliwym rozwiązaniem dla Chrome 4:

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

ok heres pomysł można wstrzyknąć skrypt za pomocą paska adresu ...

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

następnie można uruchomić cokolwiek chcesz w oknie z javascript

+0

oh i jeśli zmienna globalna dla strony powinny być w stanie odczytać je z javascript –

13

To daje odniesienie do obiektu window (jako P):

var p = unsafeWindow; 

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

dziękuję, dziękuję, dziękuję – ysth

+6

Nie ma potrzeby "wąchania sprzedawcy", możesz po prostu zrobić coś takiego: https://gist.github.com/1143845 –

+7

To nie wydaje się działać w najnowszym wersja Chrome. –

1

Jeśli y Chcesz wejść w interakcję ze stroną JavaScript, musisz wstawić skrypt do strony. (Chyba, że ​​chcesz użyć dowolnego z hacków sugerowanych na tej stronie, oczywiście.) Przygotowałem funkcję, aby zrobić to samo dla moich własnych skryptów, opublikuję ją tutaj, na wypadek, gdyby ktoś chciał z niej skorzystać.

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

Kilka przykładów do wyjaśnienia:

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

Aktualizacja:
onclick wykorzystać już nie pracuje w najnowszym Chrome zwalnia.

Aby uzyskać funkcjonalność unsafeWindow w przeglądarce Chrome, najlepiej jest zainstalować i używać Tampermonkey - niezależnie od tego będziesz inteligentny. Tampermonkey ma pełne wsparcie dla API Greasemonkey i znacznie łatwiejsze zarządzanie skryptami.

Skrypty Greasemonkey i Tampermonkey są prawie zawsze w pełni kompatybilne, co nie jest prawdą dla zwykłych użytkowników Chrome.

W toku Tampermonkey, jedyną alternatywą, która wciąż działa, jest użycie formy script injection.



Poniżej jest już nieaktualna:

Chrome now defines unsafeWindow for userscripts/content-scripts, ale nadal nie pozwala Chrome unsafeWindow dostęp do obiektów stworzonych przez JS strony docelowej.

Oto sposób, aby zapewnić odpowiednio niebezpieczne, unsafeWindow - w sposób cross-browser, który używa 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

czy to nadal działa? Próbowałem go w chromie, aby zastąpić wysyłanie XHR, ale nic nie robi. Właśnie dodałem: 'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function() {console.log ("powiadomiony o aktualizacji XHR"); oldSend.apply (to, argumenty); } 'ale nie otrzymuję danych wyjściowych podczas żądań. ten kod generuje dane wyjściowe, jeśli wstrzyknę je na stronę. – mix

+0

@Mix, Tak, właśnie potwierdziłem, że nadal działa w Chrome w wersji 18 i wersji 19 (19.0.1084.56 m). Otwórz nowe pytanie dotyczące problemu. –

+0

nie działa już w chrome – user280109