Pregunta

¿Es posible cargar archivos JavaScript remotas desde la barra de direcciones?

He estado tratando de poner esto en la barra de direcciones:

javascript:src='http://depot.com/file.js';funcname();

No estoy usando esto para cosas malas. Sólo estoy probando mi sitio, eso es todo. Si usted quiere proteger su sitio, debe aprender a atacar en primer lugar, ¿verdad?

¿Fue útil?

Solución

supongo que debe ser capaz de hacer lo siguiente:

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);
})();

Aquí hay un ejemplo muy útil (pegar esto en la barra de direcciones):

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://cornify.com/js/cornify.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);

  for (var i = 0; i < 5; i++) {
    newScript = document.createElement('script');
    newScript.type = 'text/javascript';
    newScript.src = 'http://cornify.com/js/cornify_run.js';
    document.getElementsByTagName('body')[0].appendChild(newScript);
  }
})();

Voila:

desbordamiento de pila cornificadas

De hecho, esta es la forma cornify.com está incluyendo las secuencias de comandos remotos en su bookmarklet.


ACTUALIZACIÓN:

@Ben se señala en la otra respuesta , que no es tan sencillo para llamar a una función definida en el script remoto. Ben sugiere una solución a este problema, pero también hay otra solución, la que cornify están utilizando. Si se echa un vistazo http://cornify.com/js/cornify_run.js verá que hay una sola llamada a la función en ese archivo. Se podría realizar su llamada funcname() en un archivo JavaScript independiente, como se cornify están haciendo, porque los bloques de script están garantizados para ser ejecutados en el orden en que se insertan. Entonces habría que incluir tanto las secuencias de comandos, como en el siguiente ejemplo:

javascript:(function () {
  var newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);

  newScript = document.createElement('script');
  newScript.type = 'text/javascript';
  newScript.src = 'http://depot.com/file_run.js';
  document.getElementsByTagName('body')[0].appendChild(newScript);
})();

Cuando el file_run.js simplemente incluye una llamada a funcname().

Otros consejos

No directamente una respuesta, pero muy útil, no obstante.

Aquí es un script de carga en un archivo javascript cuando se utiliza en un marcador:

javascript:var%20e=document.createElement('script');e.setAttribute('language','javascript');e.setAttribute('src','http://github.com/balupton/ajaxy-bookmark/raw/master/script.js');document.body.appendChild(e);void(0);

No hay forma directa de hacer esto, sin embargo, un truco común es ejecutar unas pocas líneas de código JavaScript que inserta una etiqueta en la página actual, estableciendo su atributo src de la URL del script que desea ejecutar:

javascript:var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);

Si desea ejecutar una función definida en el archivo remoto (a la funcname() en su pregunta), que es un poco más complejo. Esto se debe a que la carga de secuencias de comandos a través de una etiqueta se ejecuta de forma asincrónica y así archivo más probable es que tiene la carga no ha terminado la adición de inmediato el elemento a la DOM. La única manera que puedo pensar de conseguir alrededor de esto es definir una función antes de insertar el elemento, que luego se llama al final del archivo de origen incluye:

function doStuff() {
    // run code that depends on the included JS file
};
// include the external script, as per the snippet above

A continuación, había incluye una llamada a doStuff al final del archivo incluido:

if(doStuff) doStuff();

El resultado final se ve algo como esto:

javascript:function doStuff(){funcname()};var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);
scroll top