Загрузка удаленных файлов 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);
}
})();
вуаля:
на самом деле, это как 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);