Как перехватить вызов функции в JavaScript

admin

Как просто сделать удобный дебаг и не лазить в код или как бородатые хакеры перехватывают ajax-запросы, нарушая вашу безопасность.

Listener вызова метода у объекта

Допустим, у нас есть объект app, у него есть метод doStaf() и нам нужно узнать, что приходит ему на вход.

Для этого нам необходимо выполнить следующий код:

(function(doStaf) {

   app.doStaf = function() {

       // здесь выводим все аргументы, с которыми был вызван app.doStaf()
       console.log('app.doStaf args', arguments);
                
       return doStaf.apply(this, arguments);
   };
    
})(app.doStaf);

Данный код используя анонимную функцию переопределяет app.doStaf() функцией, в которой мы выполняем нужные нам манипуляции с аргументами, после чего вызываем прежний app.doStaf(), сохранившийся в замыкании.

Далее, для удобства, завернем весь этот код в функцию:

function listenCall (method, callback, obj) {
    if (typeof method !== "string" || typeof callback !== "function") return;
        
    obj = obj || window;
            
    (function(objMethod) {

        obj[method] = function() {
            try {
                callback.apply(obj, arguments);
            } catch (e) {}
                
            return objMethod.apply(obj, arguments);
        };
    
    })(obj[method]);
}

Обратите внимание на порядок аргументов: первым передаем строку-название метода или функции, которую нужно слушать (перехватить), вторым — колбэк, который нужно выполнить на вызов функции или метода и только третим передаем объект, метод которого нужно перехватить. Так сделано, потому что 3-й параметр — не обязательный и если его нет, то метод будет браться из объекта window.

Данная функция может перехватить вызов только глобально объявленых объектов или функций.

Так же вызов callback завернут в try. Это нужно для того, что бы не сломать выполнение функции в случае, если в вашем коде возникнут ошибки.

Перехват ajax-запроса

На завершение, используя описанную выше функцию, перехватим вызов любого ajax-запроса, повешав слушатель метода send() на объекте xmlHttpRequest:

listenCall('send', function () {

    // запрос получил ответ
    if (this.readyState == 4) {

        console.log('Запрос успешно перехвачен!');
        
    }

}, xmlHttpRequest);

Теперь, имея необходимые навыки, вы можете перехватывать как вызовы console.log(), так и, к примеру… запросы внутри платежной системы.

Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023