Загрузите удаленные файлы JavaScript через адресную панель
-
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);
}
})();
Вуаля:
На самом деле, так как 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);