Перехват и подмена XMLHttpRequest в JS (XHR proxy)

XHR proxy подмена трафика

Приветствую вас дорогие гости и читатели!
Сегодня речь пойдёт о нечастой, но довольно интересной теме подмены и перехвата XMLHttpRequest функции, для отладки и тестирования Ajax и WebSocket запросов в реальном времени. На языке JS, он же яваскрипт, можно переопределять некоторые системные функции, путём создания их копий и подмены на свои свежесозданные экземпляры. Таким образом, можно делать свои обёртки (wrapper) и классы, что нередко используется во многих современных JavaScript фреймворках. Такой метод прослушки трафика ещё называют XHR proxy из-за его назначения в качестве отладочного transparent proxy по типу Fiddler.

Данная функция заточена для корректной работы в браузерах на базе движка Blink (новая Opera, Chrome, Yandex.Browser, и т.д). Однако вы можете проверить её работоспособность в других браузерах и рассказать свой опыт в комментариях к заметке.

Исходник XHR прокси (спойлер)
var oldXMLHttpRequest = XMLHttpRequest;

XMLHttpRequest = function() {
    var xhr = new oldXMLHttpRequest();
    // получаем дескриптор прототипных setter/getter
    var descrGetSet = Object.getOwnPropertyDescriptor(
        Object.getPrototypeOf(xhr),
        "onreadystatechange");

    var newSet = function(val) {
        console.log("setter");
        descrGetSet.set.call(xhr, function() { // прототипный setter
            if (this.responseURL.indexOf('нужный url или домен')) {
                console.log(this.responseText);
                this.responseText = 'test'; //подменяем ответ от сервера (можно заменить лишь некоторые значения в ответе)
            }
            console.log("Inject " + this.status); // this.responseText
            return val.apply(xhr, arguments);
        });
    }

    Object.defineProperty(xhr, "onreadystatechange", {
        set: newSet, // новый setter
        get: descrGetSet.get // старый getter
    });

    return xhr;
}
//Thanks https://ru.stackoverflow.com/users/481/reinraus

Вы также можете подключить функцию программно, например из расширения Chrome, в таком случае скорее всего успех наступит более вероятно.

Нравится!
  1. Google Chrome Windows 10

    |´・ω・)ノ

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *