Привет, меня зовут Даша, я работаю тестировщицей клиентского мобильного приложения в Ozon.
Сегодня поговорим о снифферах в тестировании мобильных приложений –– программах для перехвата, анализа и модификации трафика. Пожалуй, самый популярный сниффер, о котором я слышала, — Charles. Про него уже не раз писали на Хабре, есть довольно детальные разборы. Но не Charles-ом единым!
Например, у нас в Ozon команда разработчиков в основном пользуется Proxyman, а тестировщики (в том числе и я) — Charles.
Не так давно у нас в команде разработки мобильного приложения случился холивар на тему “Charles vs Proxyman”. Я попыталась выяснить, почему некоторые люди пользуются Proxyman, а другие — Charles. Из разговоров с коллегами мне было не до конца понятно, какой из снифферов лучше (и чем именно). Поэтому я решила попользоваться Proxyman и разобраться самостоятельно. Давайте вместе посмотрим, какой из инструментов — Charles или Proxyman — выйдет победителем в битве снифферов.
Готовим поле для битвы снифферов: ключевое о тулинге
Снифферы позволяют видеть, что приходит с бэка, изменять или перезаписывать этот ответ; то же самое можно сделать с запросами на бэк. Это даёт нам отличные возможности для тестирования клиент-сервисного взаимодействия (особенно если основная логика зашита на сервере).
Например, сегодня с бэка приходит заголовок страницы, состоящий из одного слова, и всё выглядит красиво и соответствует макетам. Но завтра бэк решает написать в заголовке пару предложений вместо одного (условно) — и то, как это будет выглядеть, как раз и помогает узнать сниффер.
В своей работе я чаще всего использую следующие функции: Rewrite, Map Local, Breakpoints и Throttling.
Rewrite:
для замены URL — чтобы перенаправить трафик с тестовой среды на продакшен или наоборот (например, если фича готова только для тестовой среды);
для подмены статус-кода, который приходит с бэка, — чтобы посмотреть, корректно ли будет вести себя приложение при ошибке сервера;
для добавления или изменения заголовка в запросе — если фичу необходимо протестировать с определёнными хедерами.
Map Local — для полной замены ответа страницы с бэка на локальный файл.
Этой фичей удобно пользоваться для тестирования различных состояний элементов: открываешь файл, на который был заменён ответ страницы, меняешь в нём значение, сохраняешь и обновляешь страницу на устройстве. Как шутят наши разработчики, если у тебя достаточно сохранённых ответов с разных страниц, то из них можно построить приложение.
Breakpoints — с помощью этой функции можно поставить точку останова на любой URL; когда устройство будет его запрашивать, запрос к серверу откроется в формате редактирования.
Запрос можно будет изменить или прервать; то же самое произойдёт с ответом от сервера. По сути, Breakpoints может заменить Rewrite и Map Local, но всё же эта фича больше подходит для единоразового использования. Постоянно выискивать ту самую строчку, которую необходимо изменить, довольно затратно по времени, да и запрос за это время может отвалиться по тайм-ауту.
Throttling — отличная фича для подмены скорости интернета. Можно увидеть, как поведёт себя приложение на медленной скорости, как при этом будут загружаться картинки, видео или карта.
Давайте сравнивать Charles и Proxyman на примере этих функций.
Начинаем битву снифферов: установка и настройка
Для начала давайте разберёмся, как установить наши снифферы.
Charles: можно бесплатно скачать с официального сайта.
После инсталляции приложения устанавливаем сертификат на железо: Help -> SSL Proxying -> Install Root Certificate. Сниффер готов к работе.
Proxyman: скачиваем бесплатно с официального сайта.
Устанавливаем сертификат: Certificate -> Install Certificate on this Mac ->
Install and trust. Сниффер готов к работе.
Сравнение основных фич Charles и Proxyman
Начнём с простого.
Установка сертификата и подключение мобильного устройства к снифферу
Charles:
Убедиться, что телефон и ноутбук подключены к одной сети.
-
На мобильном устройстве: Настройки Wi-Fi -> Настройка прокси -> Вручную -> Сервер: ввести IP из Charles (Help -> Local IP Address) -> Порт: по умолчанию вводится 8888.
Открыть браузер и перейти по ссылке chls.pro/ssl.
Для Android: после загрузки сертификата необходимо его открыть и задать имя; после этого устройство будет готово к работе со сниффером.
Для iOS: Настройки -> Основные -> Профили: установить только что скачанный сертификат.
Для iOS: Настройки -> Основные -> Об этом устройстве -> Доверие сертификатам: включить для сертификата из п. 3.
Всё, вы великолепны! Можете запускать приложение и работать с трафиком.
Proxyman: процесс подключения реального устройства такой же, как в случае с Charles. Отличаются только место, где можно узнать IP, и адрес для скачивания сертификата.
Чтобы узнать IP, переходим в Certificate -> Install Certificate on iOS (Android) -> Physical Devices. Здесь можно найти IP-адрес, который необходимо вводить в настройках, а также адрес, по которому можно скачать сертификат и подробную инструкцию по его установке.
В этом раунде победителем для меня стал Proxyman. В нём есть подробное описание процесса установки сертификата на мобильное устройство. В случае с iOS многие забывают о том, что необходимо включить опцию «Доверие сертификатам», а подробная инструкция Proxyman позволяет избежать этой ошибки.
Подключение симулятора к снифферу
Подключение симулятора происходит немного по-другому по сравнению с подключением реального устройства. Я пишу тут именно про симулятор, потому что подключение эмулятора ничем не отличается от подключения реального устройства.
Charles:
Сделать ресет симулятора: Device -> Erase All Contents and Settings.
Help -> SSL Proxying -> Install Charles Root Certificate in iOS Simulators.
Сделать рестарт симулятора: Device -> Restart.
Убедиться, что вы слушаете трафик вашего компьютера: Proxy -> MacOS Proxy (должна стоять соответствующая галочка).
Proxyman:
1. Открыть Certificate -> Install Certificate on iOS -> Simulators.
2. Поставить последовательно галочки в каждом пункте.
Готово, вы великолепны!
В этом раунде тоже выигрывает Proxyman — это видно даже по количеству пунктов в списке. Несколько кликов — и всё готово, в отличие от замороченной настройки Charles.
Функции снифферов: Rewrite
Charles:
Tools -> Rewrite -> поставить чекбокс Enable Rewrite.
Нажать на Add для создания правила для Rewrite.
В окне Location с помощью кнопки Add можно добавить один или несколько URL, для которых будет работать это правило.
В окне под Location с помощью кнопки Add можно задать правило, по которому будет работать Rewrite.
Есть большой выбор типов Rewrite, которые можно задать в выпадающем меню Type. Например, можно добавить, изменить или удалить Header в Request, изменить Response Code или подменить URL запросов.
Например, вот так будет выглядеть правило для добавления Header в Request:
Proxyman:
Scripting -> Script List (⌥⌘I).
Нажать + в левом нижнем углу и задать правила, по которым будет работать скриптинг.
В поле Name внести название шаблона.
Указать URL, для которого будут работать эти правила.
Всё, после этого можно выбирать и заменять значения Request и Response.
Вот так будет выглядеть скрипт для добавления параметров Header и Query в Request:
В этом раунде для меня однозначно выигрывает Charles. Возможно, потому что я не фанат замороченных настроек и писать срипт для подмены хедера для меня слишком сложно по сравнению с нажатием нескольких кнопок.
Функции снифферов: Map Local
Следующая по порядку, но не менее важная функция — Map Local. С её помощью можно полностью подменить ResponseBody.
Charles:
Запустить приложение, чтобы трафик пошёл через Charles.
Щёлкнуть правой кнопкой по URL, ответ от которого необходимо изменить, и выбрать Map Local.
В окне Edit Mapping нажать на кнопку Choose и выбрать файл, содержимое которого должно отображаться в ответе.
Proxyman:
Tools -> Map Local.
Нажать + в левом нижнем углу и заполнить поля Name (название правила) и URL (адрес, для которого будет выполняться правило).
Нажать Select Local File и выбрать JSON-файл, которым будет подменяться ответ (запрос).
В этом раунде для меня нет победителя, но фича, с помощью которой в Proxyman можно открывать файл сразу в текстовом редакторе, мне очень понравилась.
Функции снифферов: Breakpoints
Функция Breakpoints предназначена для изменения и прерывания запросов и ответов непосредственно в сниффере.
Charles:
Нажать на кнопку Enable Breakpoints на верхней панели.
Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints.
Также можно задать правила Breakpoints в пункте меню Proxy -> Breakpoints Settings.
После перехода по указанному URL сработает Breakpoints — и запрос с ответом станут редактируемыми; по нажатию на кнопку Abort их можно будет прервать.
Proxyman:
Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints.
В открывшемся окне можно задать правила, по которым будет работать Breakpoints.
При желании можно изменить URL, а также использовать Breakpoints для чего-то одного: только для запроса или только для ответа.
В этом раунде силы снифферов равны.
Функции снифферов: Throttling
Последняя функция из основного незаменимого арсенала снифферов — Throttling.
Charles:
Proxy -> Throttle Settings.
Выбрать опцию Enable Throttling. Если поставить чекбокс Only for selected hosts, кнопка Add станет активной и по нажатию на неё можно будет добавить те URL, для которых сработает изменение скорости интернета.
-
Скорость интернета, которую будет симулировать Charles, можно выбрать из выпадающего списка или задать в соответствующих полях:
Proxyman:
Tools -> Network Conditions.
Выбрать опцию Enable Network Conditions.
-
По нажатию на + откроется окно, в котором можно настроить правила симуляции скорости интернета.
В этом раунде соперники равны.
Charles vs Proxyman: выбираем победителя
Мы рассмотрели только четыре функции снифферов — из списка незаменимых. Понятно, что в целом функций гораздо больше (надеюсь когда-нибудь собраться с силами и написать более подробный гайд по Proxyman).
Как видно из итогов раундов, у каждого сниффера есть свои плюсы и минусы. Мне нравится Charles за удобный интерфейс и более понятную настройку правил (нажал две кнопочки — и готово!), а Proxyman — за более гибкую настройку правил и подключения симуляторов (наверное, именно этим объясняется любовь разработчиков).
В этот раз явного победителя в битве снифферов нет; какой использовать, каждому предстоит решать самостоятельно. Рассказывайте в комментариях, что выбираете вы!
Комментарии (26)
GenkaOk
23.09.2021 20:25В своё время пришлось отказаться от Charles в пользу Proxyman, потому что спустя некоторое время Charles требовал оплатить лицензию и не давал просто посмотреть трафик.
Proxyman же просто ограничивает функционал и продолжает обновляться, причем так неявно, что я до сих пор не понимаю, в чем смысл ограничений. Брейкпоинты работают, прокси IOS работает.
FunnyFox94
27.09.2021 15:14На бесплатной версии ты можешь только:
создать 4 breakpoint
создать 4 maplocal
создать 4 скрипта
и тд
Danyatuna
23.09.2021 20:31+3Спасибо, статья супер!
Последнюю неделю стал пользоваться proxyman, пока всё нравится, особенно потребление памяти. Чарльз отжирал 1 гб в среднем, а проксимен 200мб
К некоторым вещам ожидаемо пришлось привыкать, но теперь проксимен кажется даже удобнее
dashakhme Автор
24.09.2021 11:21спасибо за отзыв) да, нужно попользоваться обоими инструментами, чтобы для себя понять какой удобней
JimDi
23.09.2021 21:25+5Fiddler
tundrawolf_kiba
24.09.2021 00:35Новая версия Fiddler — Fiddler Everywhere — тоже стала платной, как и инструменты из статьи, последнее время стал посматривать в сторону бесплатной inProxy, но она пока что ещё сильно молодая.
Vest
24.09.2021 11:04+1Пока есть бесплатная, то пользуюсь ею. Выручала разными трюками, например, подмена ресурса.
Самая классная вещь в Фидлере, это посмотреть количество соединений и какие запросы оказываются блокирующими. Например, можно увидеть, что какие-то запросы обслуживаются только одним соединением.
vabka
24.09.2021 14:17Я пользуюсь Mitmproxy — выглядит сыроватым, но по фичам вроде ок — можно фильтровать запросы, менять контент и запроса и ответа.
Можно на питоне плагины писать, но ещё не пробовал.
amarao
23.09.2021 21:32+8Мне как админу, не понятно, почему это "сниффер"? Сниффер - это приложение для подслушивания трафика. То, что вы описываете, это прокси. Сквид умел менять содержимое страниц ещё когда я патч-корды подавал. С тех пор там появилось "всё" про SSL, но суть прокси-то не поменялась...
semenovs
24.09.2021 01:06+1Такой сленг почему то. Предлагаю потому что 99% времени их реально используют просто что бы смотреть какие запросы идут между беком и приложением. Изменение запроса это типа для хардкор чуваков :)
catz_a
24.09.2021 10:14Возможно потому, что в эпоху ssl трафика снифером много не подслушаешь и в данном случае границы прокси и снифера размываются. Хотя согласен, что немного притянуто.
amarao
24.09.2021 22:00+1Собственно, сквид умел переподписывать SSL с корпоративным сертификатом ещё до того, как я с ним познакомился. И это всё равно proxy. Сниффер не размещает себя между трафиком и пользователем.
Сниффер (тот же tcpdump) вместе с серверным ключом позволяет дешифровать записанную сессию (в том же wireshark'е).
semenovs
24.09.2021 01:02Это же все очень не удобно. Да и по ресурсам они что то ппц систему грузят. Я обычно беру связки типа MITMProxy и Burp. Хотя если есть тонна времени что бы настраивать правила наверно можно себе позволить
vmityuklyaev
24.09.2021 10:09Наконец-то кто-то сравнил Чарльз и Проксимен, спасибо! Но все равно прокимен остается в сердечке)
Единственно, что не удобно с проксименом - это ограничение в 4 map local и примерно в 10 url для просмотра трафика (SSL proxying List) для бесплатной лицензии.
Понятно, чт это лечится банальной покупкой лицензии, но, кажется, в Чарльз этих ограничений нет? Если ошибаюсь - поправьте, пожалуйста)dashakhme Автор
24.09.2021 11:16спасибо за отзыв)
да, у Чарльз другие ограничения в работе без лицензии - каждые 30 минут приходится переподключатьсяnovoselov
24.09.2021 11:44Столкнулся в Charles с проблемой, не всегда работает SSL proxying:
есть BlueStacks эмулятор, в него установлен сертификат от Charles
в Charles включено SSL проксирование всех запросов (через *)
вижу два web socket подключения, одно secure через wss://host и внутри нормально расшифровывается траффик, а второе ws://ip и хотя внешне оно не secure, но похоже трафик внутри зашифрован
Или Charles неправильно воспринимает второе подключение, или это какая-то специальная защита :)
Prituzhaloff
25.09.2021 13:54+2Fiddler classic - полностью бесплатен, функционал тот же, настройка проще. До этого юзал Fiddler Everywhere, вот он вообще максимально был удобным. Жаль, что стал платным. На чарльзе учился, честно пытался привыкнуть к нему, но как то совсем не зашёл, ну лично мне. Еще эти переподключения каждые 30 мин. Из платных для меня топ - Fiddler Everywhere, из бесплатных - Fiddler classic.
droidbishop
27.09.2021 11:36Существенную роль по переходу на Proxyman для меня сыграло то, что он включен в подписку от Setapp.
Crbn
27.09.2021 11:38Charles с Fiddler было бы более удачное сравнение. Так как они чаще всего юзаются именно течтировшиками и просты в использовании. Особенно интересно сравнение rewrite, map local.
FunnyFox94
27.09.2021 15:23У проксимена современный UI. Есть разные фишки, которые облегчат жизнь, например гибко настраиваемая фильтрация с возможностью выделять цветом запросы и писать в них комменты.
Можно так же группировать запросы по разным цветам. Можно удобно кастомизировать поиск. Например not contains, с помощью этого фильтра вы можете убрать отображение запросов, которые содержат/не содержат искомую инфу для ускорения вашей работы.
У чарлика 1 релиз за полгода, у проксимена раз в 2 недели и можно ознакомиться с графиком рилизов(когда уже будет винда?)
Tibiamist
06.10.2021 11:58В работе использую Fiddler, судя по комментам выше, про платность двух сниферов, кажется что фидлер это выход)
Secondher0
06.10.2021 11:58Действительно не хватает статейке сравнения с бесплатным Fiddler. Все таки любим халяву)))
Khrum
Charles!