Загрузите удаленные файлы JavaScript через адресную панель

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

  •  04-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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. Включает в себя удаленные скрипты в их блокмаркете.


ОБНОВИТЬ:

Так как @ Бен отметил в другом ответе, это не так просто позвонить в функцию, определенную в вашем удаленном скрипте. Бен предлагает одно решение этой проблеме, но есть и другое решение, то, что с использованием 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 при использовании в закладке:

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

Однако нет прямого способа сделать это, однако обычный взлом - запускать несколько строк 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top