Всем привет, меня зовут Катя, я QA Engineering Manager в inDriver. В этой статье расскажу про свой опыт использования Proxyman, а также о том, почему считаю его лучшей программой-сниффером. Приятного чтения!
Что мы хотим от снифферов?
Итак, что вообще такое «сниффер»? Снифферами называют инструменты, позволяющие перехватывать, анализировать и модифицировать все запросы, которые через них проходят. Они позволяют исследовать сетевое взаимодействие клиента и сервера (это, грубо говоря, высветляет наш черный ящик), а также эмулировать различные тестовые сценарии, модифицируя трафик.
Основной запрос к снифферам — мониторинг трафика. Нам необходимо знать, что происходит на сетевом уровне. Что мы проверяем? По пунктам:
Что запрос вообще уходит.
Блокирующий ли запрос — очень важно на старте приложения.
Время между действием и уходом запроса.
Правильно ли составлен запрос — URL, формат, параметры, данные.
Что запрос не дублируется.
Что порядок отправляемых запросов верный.
Время ответа, тайм-аут и формат ответа.
Если мы будем видеть, на каком этапе произошла ошибка — фактически, баг локализован.
Принцип работы
Снифферы работают по принципу man in the middle. У нас есть промежуточный сервер, через который проходят запросы и ответы. Сниффер запускается на компьютере, который находится в той же локальной подсети, что и мобильное устройство с тестируемым приложением.
Как правило, соединение настраивается по Wi-Fi. В настройках Wi-Fi мобильного устройства в качестве прокси-сервера указывается IP-адрес компьютера и порт инструмента. IP-адрес можно узнать через командную строку (ifconfig) или в самом сниффере.
С HTTPS немного сложнее — нужно установить SSL-сертификат сниффера на устройство и разрешить девайсу доверять сертификату, чтобы трафик расшифровывался.
Но есть нюанс с SSL-пиннингом — процессом сверки полученного сертификата с вшитым в приложение. Если в вашем приложении есть SSL-пиннинг, потребуется обратиться к разработчикам для его отключения на тестовой версии приложения. Иначе не получится подсмотреть трафик приложения.
Выбор оптимального сниффера
Давайте пройдемся по широко используемым в тестировании мобильных приложений инструментам.
1. Первый парень — Wireshark. Он низкоуровневый, поддерживает сотни протоколов — можно засниффать различные виды трафика: HTTP, VoIP, BLE и другие. С ним чувствуешь себя настоящим хакером, он кроссплатформенный и классный.
Минус — Wireshark не расшифровывает HTTPS-трафик в режиме реального времени. Сначала нужно записать пакеты, скормить ему их и сертификат — и тогда можно посмотреть трафик.
2. Следующий — Charles. Он мировая звезда, знаком тестировщикам, разработчикам и системным аналитикам. У него много функций, инструкций и статей. В том числе, на русском. Опять-таки, он кроссплатформенный.
Минус — в бесплатной версии выключается каждые полчаса.
3. Дальше — Fiddler. Здесь я рассматриваю классический Fiddler, не Fiddler Everywhere. Он резво работает на Windows, мне в нем безумно нравится, что между функциями можно переключаться парой кликов. Также плюсами назову регулярные выражения на подмены (Autoresponder) и довольно гибкий инструмент Scripting.
Минус — интерфейс у него немного гиковатый, и он работает только на Windows.
Мини-бонус: мне в свое время настолько нравился Fiddler, что последний пункт не был для меня минусом: на рабочий макбук я поставила VirtualBox с виндой и настроенным в ней Fiddler’ом.
4. Гвоздь программы — Proxyman. Он хорош тем, что нативен на MacOS и использует все интерфейсные преимущества данной операционной системы. Proxyman молодой, развивающийся, к нему часто выходят новые версии. Он сделан так, чтобы быть интуитивно понятным.
Минус — в бесплатной версии обрезается количество возможных подмен и правил. А еще на винду его не поставить.
Есть, конечно, и другие снифферы: mitmproxy, Fiddler Everywhere, Burp Suite и так далее. Но они не настолько распространены среди QA-инженеров.
Почему Proxyman?
Расскажу подробнее, чем же хорош Proxyman. Я поработала с ним примерно год и хочу поделиться с вами преимуществами этого инструмента.
1. Киллер-фича — инструкция буквально на каждый чих. Например, мы хотим установить сертификат на реальное iOS-устройство. Как это сделать? Жмем «Install certificate on iOS».
Идем дальше -> Physical Devices — и перед нами инструкция, где буквально расписан каждый шаг, плюс ссылочка на траблшутинг, плюс запомните слово Atlantis — оно вам пригодится. Такая же инструкция есть на Android, также есть инструкция для разработчиков, как разрешить приложению использовать подменный сертификат.
2. Скрипт для эмуляторов и симуляторов. Если надо поставить сертификат на эмулятор и сниффать трафик с него — просто открываем Install certificate on Android -> Emulators, жмякаем кнопочку Override Emulator, выполняется скрипт — готово.
Аналогично на iOS: Install certificate on iOS -> Simulators, жмякнуть кнопочку Install and Trust, посмотреть, перезапустить эмулятор — done. Единственное, трафик эмуляторов будет считываться как отдельное устройство, а симуляторов — как приложение, его нужно поискать в списке приложений:
3. Возможность запинить домены, приложения, на которых необходимо сфокусироваться. Очень удобно, чтоб не потерять нужное в огромном числе реалтайм-запросов.
4. Группировка девайсов по IP, плюс возможность задать никнеймы. Можно не париться, от какого девайса запрос, кто и почему крашнулся. У нас все сгруппировано. Must have при мобильном тестировании на куче разных девайсов.
5. Группировка всех запросов по дереву. Вот у нас хосты, кликаем дальше, и по пути постепенно приходим к нужному запросу. Если хотим обратно переключиться на все запросы — кликаем на девайс, только на хост — кликаем хост. Это примерно также, как Structure в Charles, только на стероидах.
6. Классный поиск. Во-первых, можно выбрать, по каким параметрам мы ищем: URL, запрос, тело, метод, даже цвет. Во-вторых, можно использовать разные параметры, в том числе, мои любимые регулярки. Супер.
7. Скриптинг. Это использование JavaScript для каких-либо манипуляций. Здесь также есть регулярка, такие же фильтры.
Либо вот, например, можно менять запросы/ответы. Это чем-то схоже с рерайтом в Charles — я подменяю заголовок или статус-код по правилу.
Можно написать кучу всего по любым параметрам. Но код — казалось бы, сложно, непонятно, учить JavasScript, oh no! Ах, да, киллер-фича номер 1: кликаем Snippet Code, и вот у нас документация с готовыми кусочками кода на разные задачи, сгруппированная по категориям (вот ссылка на коллекцию этих кусочков).
Подумала: может, я свихнулась на Proxyman? Всем рассказываю про него, многие коллеги уже на него перешли. Опросила разных людей — бывших коллег, разработчиков, тестировщиков. Мнения плюс-минус совпали: интерфейс удобный, достаточно резво работает, меньше ошибок, многое продумано.
Казалось бы, по плану все. Но есть кое-что еще.
Бонус 1
Ребята, которые пилят Proxyman, сделали клевый фреймворк для iOS. Он встраивается в приложение — чтобы засниффать трафик, не нужно каждый раз настраивать устройство, прописывать хост, ставить сертификат, разрешать его в одном месте, разрешать в другом...
Берешь девайс, в Proxyman находишь кнопочку «Найти девайс». Девайс и компьютер с поднятым на нем Proxyman должны находиться в одной сети — и все перехватывается само.
Правда, таким образом можно только инспектировать трафик: подменять запросы, ответы и прочие манипуляции не получится. Но это все равно экономит время, особенно с учетом того, что просмотр трафика — основной запрос к снифферам.
Бонус 2
Есть мобильная версия для iPhone! Заходим в AppStore, качаем. Работает через VPN-сертификат, настраиваем согласно инструкции — и можно смотреть трафик без компьютера.
Чтобы посмотреть, кликаем на запрос. Тело запроса вынесено в отдельный экран, потому что в мобильной версии неудобно, если все будет одной простыней. Также здесь можно запинить домены для удобства.
Опять же, доступен только мониторинг трафика, никаких модификаций сделать не получится. Зато плюс – лицензия с десктоп-версии включает в себя и лицензию на мобильную версию.
Подытоживая, подчеркну, что мониторинг трафика суперважен. Он спасает жизни, продукт от багов, разрабов от долгих попыток разобраться в причинах ошибок. Proxyman же делает данный процесс более удобным.
Спасибо, что дочитали статью до конца. Буду рада вашей обратной связи в комментариях.
Комментарии (10)
chemtech
30.11.2021 18:10Спасибо за пост. Подскажите, пожалуйста, если знаете сниффер/прокси, который бы записывал только request.header, response.header, записывал ip источника, ip получателя. В Openshift как sidecar контейнер я его сам добавляю. Я нарисовал простую схему для понимания. Заранее спасибо.
Krivitskiy_Anton
30.11.2021 18:52+1Почему Proxyman?
Расскажу подробнее, чем же хорош Proxyman. Я поработала с ним примерно год и хочу поделиться с вами преимуществами этого инструмента.
То есть, тут подразумевались преимущества Proxyman над другими снифферами, насколько я понял. Но при этом:
П. 1 инструкция буквально на каждый чих.
При этом у того же чарльза: "много функций, инструкций и статей. В том числе, на русском".П. 3 и 5 тоже вполне чарльз покрывает и регулярки он тоже поддерживает.
Плюс есть Throttling, Mirror, который может помочь сделать моковые данные. И Map Remote/Local уже фича для более редких кейсов использования.
И как уже написано в статье - он кроссплатформенный, а то не все работают на маках.
При этом почему-то в минусах чарльза указано, что он работает без лицензии всего полчаса, но стоимость лицензий у разных снифферов не вравнивается.
Единственное, что подбешивает в чарльзе - это поиск, но только ради него вряд ли буду менять инструмент.
thedrugsthatdeceiveyou Автор
30.11.2021 19:02+2в чарльзе инструкции на сайте, а в проксимане внутри программы, то есть не понадобится отдельно гуглить
Krivitskiy_Anton
30.11.2021 19:06Ну во первых, лично я не вижу проблемы загуглить инструкцию, вроде доступ к интернету всегда есть. Во вторых, тот же чарльз настраивается один раз и потом просто работаешь, не думая о всяких инструкциях.
Мб это и плюс, но не тянет на аргумент в пользу смены инструмента.
Статья в любом случае написана хорошо, молодец, даже плюсик в карму поставлю)
thedrugsthatdeceiveyou Автор
30.11.2021 19:21+1это лишь причины выбора инструмента, у всех свои запросы)
спасибо!
stAnger917
01.12.2021 22:22Каждому свое, конечно же) раньше пользовался Fiddler - но потом пересел на макбук - и тут использую только Proxyman - в Чарльзе мне не нравился интерфейс, да и каждые пол часа перезапускать его - то еще удовольствие)
А касательно минусов Proxyman - работаю одновременно на двух проектах - в целом, мне хватает того лимита что там есть)
printf
mitmproxy же. Открытые исходники на питоне, весь функционал конечно же доступен бесплатно, расшифровывает HTTPS на лету, прост в использовании, можно модифицировать запросы и ответы, скриптовать произвольным образом.
NateF
Спасибо за наводку)