Написано 21.09.2016
Говоря об угоне, первой реакцией может быть что-то плохое. Перехват функций — это не зло, ключ в том, чтобы увидеть, кто их использует. Хотя эта концепция редко используется во внешнем интерфейсе, она по-прежнему имеет определенную ценность в области безопасности, индивидуальном бизнесе и других сценариях. Поэтому эта статья поможет вам понять, что такое перехват функций в JS и для чего он полезен.
основная концепция
Перехват функции, как следует из названия, перехватывает функцию до ее запуска, добавляя желаемую функциональность. Когда эта функция действительно запускается, это уже не исходная функция, а функция, которую мы добавили. Это тоже обычное дело для нас钩子函数один из принципов.
На первый взгляд это очень похоже на переписывание функции. Переписывание функции тоже можно понимать как своеобразный захват функции, но такой способ слишком отвратительный. Как угонщик, вы также должны соблюдать профессиональную этику после похищения преимуществ и вернуть человека неповрежденным, поэтому мы должны отозвать первоначальную функцию функции в подходящем месте.
В более широком смысле мы часто сталкиваемся с понятием «угон», например, веб-сайт был взломан оператором, и при просмотре веб-сайта появляется реклама оператора.
Пример анализа
Теперь давайте возьмем простой пример, угонalert()function, добавив к ней немного функциональности:
let warn = alert
window.alert = (t) => {
if (confirm('How are you?')) warn(t)
}
alert('Help me...!!!')
Вы можете открыть инструменты разработчика и попробовать этот пример, вы обнаружите, что только выconfirmНажмите OK внутри, появится всплывающее окно.Help me...!!!.
Далее мы инкапсулируем содержимое этой части в общую функцию:
const hijack = (obj, method, fun) => {
let orig = obj[method]
obj[method] = fun(orig)
}
Сначала мы определяемhijackфункция, она сначала сохранит исходную функцию, а затем выполнит пользовательскую функцию, и исходная функция будет вызвана внутри пользовательской функции.
Затем мы угоняемconfirm()функция:
hijack(window, 'confirm', (orig) => {
return (text) => {
alert('HELP ME PLZ!!!')
if (orig.call(this, text)) {
alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!')
} else {
alert('HOLD ON! I AM COMING!!')
}
}
})
Функция этой функции очень проста и подробно объясняться не будет, просто вызовите ее напрямуюconfirm()И ты знаешь:пример кода
Анти-угон
Создайте новую страницу, откройте консоль инструментов разработчика, введитеalert, вы увидите такой вывод:
function alert() { [native code] }
Затем, используя код в начале этой статьи, поместитеalert()Hijack, повторно вошел в консольalert, вы увидите такой вывод:
function (t) => {
if (confirm('How are you?')) warn(t)
}
Из приведенного выше примера мы можем узнать, что для того, чтобы узнать, была ли взломана функция, просто распечатайте ее напрямую. Для системных собственных функций,[native code]Это означает, что он чистый и не содержит загрязнений.
Роль перехвата функций
Помимо добавления функциональности к функциям, перехват функций также может использоваться для отслеживания информации о злоумышленниках. Общие атаки XSS сначала будут использоватьalert()Дождитесь методов, которые могут выводить информацию для тестирования, в это время мы можем сначала протестировать роднойalert()Взломайте, введите в него код для отслеживания информации и, наконец, отпустите исходную функцию. Когда злоумышленники тестируютalert()Мы сразу же его выследим, но у него самого нет возможности это обнаружить.
постскриптум
Перехват функций в JS не нов, но я столкнулся с этим знанием в своей недавней работе и чувствовал себя относительно незнакомым, поэтому я потратил некоторое время на исследование и запись результатов. Если вы найдете что-то не так, пожалуйста, поправьте меня!
Спасибо за чтение, добро пожаловать в мою колонку, я поделюсь своим опытом обучения, опытом разработки и время от времени выношу галантерею за стену. Увидимся в следующий раз!
Использованная литература: