javascript - greasyfork - ¿Cómo puedo imitar la funcionalidad insegura de Windows de Greasemonkey/Firefox en Chrome?
tampermonkey scripts (5)
ok aquí hay una idea de que puedes inyectar el script usando la barra de direcciones ...
javascript:var ElEm = document.createElement("script");ElEm.src=''[path_to_script]'';document.body.appendChild(ElEm);
entonces puedes ejecutar lo que quieras en la ventana con tu javascript
Solo estoy jugando con las secuencias de comandos del usuario en Chrome en este momento, así que por favor tengan paciencia con mi ignorancia / idiotez.
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 a x
desde el espacio de nombres global?
Por ejemplo, si la única línea en mi usuario está 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?
Esto le dará una referencia al objeto 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();
};
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}
}
Algunos 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.
contentWindow
estuvo disponible en Chrome 3, pero eliminado en Chrome 4 . La única solución posible para Chrome 4:
location.href="javascript:(function(){ alert(''Hello''); })()"
Actualizar:
El exploit onclick
ya no funciona en las últimas versiones de Chrome.
Para obtener la funcionalidad unsafeWindow
en Chrome, la 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.
Las secuencias de comandos de Greasemonkey y Tampermonkey casi siempre son totalmente compatibles, algo que no es cierto para los archivos de usuario simples de Chrome.
Renunciando a Tampermonkey, la única alternativa que todavía funciona es usar alguna forma de inyección de script .
Lo siguiente ahora está obsoleto:
Chrome ahora define unsafeWindow
para userscripts / content-scripts , pero Chrome unsafeWindow
aún no permite el acceso a los objetos JS creados por la página de destino.
A continuación, se unsafeWindow
cómo proporcionar una unsafeWindow
insegura e insegura, en una forma de navegador cruzado que utiliza detección de características (buena) versus detección de navegadores (mala) :
/*--- 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 ();
} ) ();
}