Загружать удаленные файлы JavaScript через адресную строку - PullRequest
8 голосов
/ 18 сентября 2010

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 18 сентября 2010

Полагаю, вы сможете сделать следующее:

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 включает удаленные сценарии в свои закладки.


ОБНОВЛЕНИЕ:

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

3 голосов
/ 19 сентября 2010

Не является прямым ответом, но тем не менее полезен.

Вот скрипт для загрузки в файл 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);
2 голосов
/ 18 сентября 2010

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...