12 декабря 2014 г.

Fiddler. Инструмент для анализа HTTP

Fiddler - это отличный и бесплатный инструмент для анализа HTTP трафика. В этой статье я постараюсь описать некоторые его базовые возможности.

Fiddler был написан Эриком Лоуренсом (Eric Lawrence) в то время когда он работал в Microsoft, в группе по разработке IE. В 2012 году Fiddler был приобретен компанией Telerik, Эрик так же перешел в Telerik для продолжения работы над своим продуктом.

Страница - http://www.telerik.com/fiddler

Fiddler представляет из себя прокси, который захватывает весь HTTP и HTTPS трафик, позволяя его анализировать и даже изменять.

Конечно, если и другие средства анализа, например для более глубокого анализа можно использовать Microsoft Network Monitor:


С другой стороны анализ запросов Web приложений можно провести прямо в браузере, используя Developer Tools, которые обычно доступны по клавише F12:


Fiddler похож на "золотую середину". С его помощью можно:
  • исследовать проблемы; 
  • анализировать производительность; 
  • подменять запросы и ответы; 
  • тестировать безопасность; 
  • и т.д. 
Для начала работы с Fiddler достаточно его установить и запустить, после этого запросы приложений, поддерживающие работу через прокси, начнут идти через него.

Если на вашем компьютере работает сервер и по какой-то причине запросы к localhost или 127.0.0.1 не идут через прокси, вы можете использовать виртуальное имя ipv4.fiddler (ipv6.fiddler).

Статистика


Выполнив запрос к http://www.yandex.ru и остановив захват трафика (F12) можно увидеть что фактически был выполнена 31 сессия запросов и ответов. По каждой сессии или выделив сразу несколько сессий можно посмотреть статистику на вкладке Statistics:


На вкладке Timeline можно увидеть как запросы выполнялись во времени.

В списке сессий сразу можно видеть пиктограмму типа данных, статус, адрес, размер и другую информацию.

Чтобы быстро увидеть сессии, на выполнение которых ушло много времени, можно использовать фильтр: на вкладке Filters необходимо отметить пункт Use Filters, и в блоке Response Type and Size отметить Time HeatMap. Для того чтобы применить настройки фильтра в верхней части вкладки необходимо нажать на кнопку Action и выбрать Run Filterset now. После применения фильтра некоторые сессии в списке могут поменять фон в зависимости от затраченного времени:

(запрос к http://maps.yandex.ru/)

Отправка запросов


Еще одной функцией Fiddler является возможность отправлять запросы, например для отладки серверного метода или его проверки. Вся работа связанная с отправкой запроса выполняется на вкладке Composer. Сюда можно перетащить сессию из списка, модифицировать запрос и отправить его на сервер нажав кнопку Execute.

Чтобы просто повторно отправить запрос можно выбрать его в списке и нажать R, или выбрать пункт контекстного меню Replay (там же есть вариант изменить запрос перед отправкой).

Для примера отправим запрос к методу groups.getById из API сайта vk.com. Для этого я выполнил этот запрос из браузера, в окне Fiddler перетащил его на вкладку Composer, изменил параметр и выполнил:


Сразу открылась вкладка Inspectors, в нижней части которой я увидел ответ в формате JSON.

Еще один вариант использования этой возможности - отправка различных значений в заголовке Accept-Language, для того чтобы посмотреть результаты на разных языках, но результат придется смотреть на вкладке Inspectors что в данном случае может быть не так удобно как в браузере.
Другой вариант замены Accept-Language - это использование фильтра: необходимо включить фильтр, в блоке Request Headers включить Set request header и указать интересующий язык, возможно также потребуется включить Delete request header чтобы удалить cookie:


Для примера попробую загрузить vk.com с указанием другой локализации:


Как видно на скриншоте браузер в заголовке Accept-Language отправил ru-RU, но это значение было заменено на en с помощью фильтра Fiddler. В результате страница вернулась на английском языке.

Так же фильтр может отобрать только сессии содержащие определенный URL или запросы отправленные определенным процессом, скрыть ответы с определенным статусом (2xx, 3xx и т.д.), помечать запросы (ответы) содержащие определенный заголовок, заблокировать файлы по типу или размеру и т.п.

Кстати, набор условий для фильтрации можно сохранять и загружать, используя пункты Save Filterset и Load Filterset у кнопки Actions в верхней части вкладки.

Breakpoints


Fiddler позволяет устанавливать точки останова перед отправкой запроса на сервер или перед передачей ответа клиенту.
Включить их можно различным образом:

  • переключателем в строке состояния;
  • через меню Rules - Automatic Breakpoints;
  • с помощью клавиш F11, Alt+F11 и Shift+F11 для выключения.
Когда Fiddler останавливает выполнение запроса или отправку ответа - есть возможность внести в него изменения:


AutoResponder


Раз уж Fiddler - это прокси, то функция отправки ответа клиенту без фактического обращения к серверу вполне ожидаема. Все что нужно сделать - это создать правила и действия для них на вкладке AutoResponder. Правило представляет из себя строку для поиска или регулярное выражение, а в качестве действия может быть возврат определенного статуса, файла, перенаправление на другой адрес и т.д. Таким образом можно даже тестировать запросы к несуществующему или недоступному серверу или адресу:


Проверка запроса к несуществующему адресу:


Обратите внимание на включенные опции Enable automatic responses и Unmatched requests passthrough - первая включает автоматическую отправку ответов по созданным правилам, вторая пропускает все остальные запросы непосредственно к серверу.

Все созданные правила для AutoResponder можно сохранить в файл *.farx.

Перехват запросов от других устройств


Возможно вам требуется просмотреть трафик от вашего телефона или планшета в Fiddler. Первое что необходимо сделать - это в Fiddler выбрать пункт меню Tools - Fiddler Options..., в открывшемся окне перейти на вкладку Connections и включить опцию Allow remote computers to connect.

Уже после этого если вы откроете браузер в телефоне или планшете и введете <IP_компьютера>:8888 (порт по умолчанию) - запрос отобразиться в списке сессий.
Но такой вариант не удобен для просмотра запросов из приложений, поэтому необходимо сделать так чтобы все запросы шли через нужный нам прокси. Для Android есть приложения для глобальной настройки прокси (требуется root). Я использую ProxyDroid. После изменения настроек прокси, запускаем приложение, например Yandex.Metro и видим запросы и ответы от приложения:



QuickExec


Еще одна удобная возможность в программе - использование команд. Для начала ввода команды необходимо поместить курсор в поле QuickExec или нажать Alt+Q.
Самые популярные команды:
  • ?текст - поиск URL, содержащих указанный текст, в списке сессий;
  • >размер, <размер - поиск сессий, где размер ответа больше или меньше указанного (в байтах);
  • =статус или метод - поиск сессий с определенным статусом ответа (301, 500 и т.д.) или методом запроса (POST, GET и т.д.);
  • cls - очистка списка сессий;
  • g или go - продолжить выполнение всех breakpoint.

Полный список команд доступен на странице документации.

Что еще умеет Fiddler


Есть еще несколько интересных возможностей:
  • симулировать работу через модем. Включить можно через меню Rules -> Performance -> Simulate Modem Speeds;
  • использовать различные значения для поля User-Agent. Меню Rules -> User-Agents;
  • сохранять одну или несколько сессий в архив (*.saz) с возможностью задать пароль. Сделать это можно либо через контекстное меню или через меню File. Для установки пароля в окне сохранения необходимо выбрать тип файла Password-Protected SAZ (*.saz);
  • утилита TextWizard - помогает быстро конвертировать текст в различные кодировки. Запустить можно с помощью кнопки TextWizard на панели инструментов, через меню Tools -> TextWizard..., или нажав Ctrl+E.

Подводя итоги можно сказать что Fiddler - это мощный и удобный в использовании инструмент, который может быть отличным помощником при разработке и отладке программ, сервисов и т.п.

18 комментариев:

  1. Ответы
    1. Wirechark относится к более продвинутым инструментам, а для повседневных задач и Fiddler отлично подходит.
      В планах есть статья про Wireshark, так что это вопрос времени.

      Удалить
  2. Для примера попробую загрузить vk.com с указанием дрогой локализации:

    Вы допустили ошибку в слове "другой"

    ОтветитьУдалить
    Ответы
    1. Дмитрий, спасибо. Исправил.

      Удалить
    2. В целях отладки запросов мне нужно подключить роутер к интернету с помощью "Общий доступ к интернету" используя свой ethernet порт ноутбука как LAN (раздача интернета). При этом интернет раздается с другой сетевой карты (WiFi). Как мне заставить ходить роутер через Fiddler если прописать в роутер я это не могу (не нужно говорить про uart/serial, не тот случай)?

      Удалить
    3. Если нет возможности настроить прокси на роутере, то как вариант (если это для тестовых целей) можно захватывать весь трафик с помощью Microsoft Network Monitor или Wireshark и сохранять в CAP-файл. Затем в Fiddler выбрать File > Import > Packet Capture и изучать.
      Но думаю что есть и другие решения для такой ситуации.

      Удалить
  3. > Если на вашем компьютере работает сервер и по какой-то причине запросы к localhost или 127.0.0.1 не идут через прокси, вы можете использовать виртуальное имя ipv4.fiddler (ipv6.fiddler)
    Можно об этом поподробней: где и как "использовать виртуальное имя"? Спасибо

    ОтветитьУдалить
    Ответы
    1. С такой проблемой можно столкнуться при использовании старой версии (<9) Internet Explorer или при написании .NET приложений. Суть в том что локальный трафик (трафик адресованный на localhost или адрес 127.0.0.1) они не пускают через прокси, соответственно этих запросов не будет видно в Fiddler'е.
      Чтобы обойти подобные ограничения есть виртуальные имена - т.е. вы отправляете запрос на адрес ipv4.fiddler, Fiddler его перехватит и перенаправит на 127.0.0.1

      Удалить
  4. Добрый день. У меня есть необходимость зациклить POST запрос на несколько часов. Сидеть и долбить кнопку Execute не хочется. Подскажите как это сделать в Fiddler?
    Спасибо!

    ОтветитьУдалить
    Ответы
    1. Добрый день, Михаил. Вы можете выполнить этот запрос один раз, затем в списке сессий слева выделить его и нажать клавишу "S" или выбрать в контекстном меню Replay -> Reissue Sequentially. В открывшемся окне введите сколько раз необходимо повторить запрос.
      Если между запросами надо вставить паузу - можете настроить AutoResponder на этот запрос, а в качестве ответа выберите *delay:1000 (задержка 1 сек.)

      Удалить
    2. Спасибо большое! C AutoResponder немного не понял. Если я делаю репит на 10 запросов и ставлю на AutoResponder *delay10000, то он ждет 10 сек, а потом посылает все 10 запросов сразу. Как сделать чтобы он ждал после каждого запроса?

      Удалить
    3. Я предполагаю что у Вас включена опция "Match only once". Эта опция находится напротив поля где указано *delay:10000.

      Удалить
    4. Нет, с этого поля галка убрана.

      Удалить
    5. Странно. Специально протестировал - пауза после каждого запроса вставляется.
      А какое правило Вы использовали? EXACT:_URL_?

      Удалить
    6. Да, так и использовал. Ну ничего, решил уже задачу wireshark-ом. Еще раз спасибо за помощь!

      Удалить
  5. Здравствуйте. Подскажите, как вычислить майнер на ресурсе? Вот например на этом s1.nod-key.com
    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Выполнив запрос через Composer видно что возвращается страница, содержащая какой-то скрипт. Он обфусцирован, поэтому определить его с помощью фильтров будет сложно.
      Я бы советовал использовать специальное расширение для браузера, например No Coin.

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

      Удалить