Загрузка удаленных файлов JavaScript через адресную строку

можно ли загружать удаленные файлы JavaScript из адресной строки?

Я пытался поместить это в адресную строку:

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

Я не использую это для плохих вещей. Я просто проверяю свой сайт, вот и все. Если вы хотите защитить свой сайт, вы должны сначала научиться атаковать его, верно?

3 ответов


Я думаю, вы должны быть в состоянии сделать следующее:

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

вот очень полезный пример (вставьте это в адресную строку):

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

вуаля:

Stack Overflow cornified

на самом деле, это как cornify.com включает удаленные скрипты в свой букмарклет.


обновление:

As @Ben отметил в другом ответе, это не так просто назвать функция, определенная в удаленном скрипте. Бен предлагает одно решение этой проблемы, но есть и другое решение, которое использует cornify. Если вы проверить http://cornify.com/js/cornify_run.js вы увидите, что есть только один вызов функции в этом файле. Вы могли бы разместить свой funcname() вызовите отдельный файл JavaScript, как это делает cornify, потому что блоки сценариев гарантированно будут выполняться в порядке их вставки. Тогда вам нужно будет включить оба сценария, как в следующем пример:

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

здесь file_run.js просто включает в себя вызов funcname().


нет прямого способа сделать это, однако общий Хак состоит в том, чтобы запустить несколько строк JavaScript, который вставляет тег в текущую страницу, устанавливая его атрибут src на URL-адрес скрипта, который вы хотите запустить:

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

если вы хотите запустить функцию, определенную в удаленном файле (à la funcname() в вашем вопросе), это немного сложнее. Это связано с тем, что загрузка скриптов через тег выполняется асинхронно, и поэтому файл, скорее всего, не закончил загрузку сразу добавление элемента в DOM. Единственный способ обойти это-определить некоторую функцию перед вставкой элемента, который вы затем вызываете в конце включенного исходного файла:

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

затем вы включаете вызов doStuff в конце включенного файла:

if(doStuff) doStuff();

конечный результат выглядит примерно так:

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);

не напрямую ответ, но тем не менее полезно.

вот скрипт для загрузки в файл JavaScript при использовании в закладки:

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);