Перезапись тела
Chute может искать и заменять содержимое в телах HTTP-запросов и ответов, используя регулярные выражения или выражения JSONPath. Для HTTPS-трафика требуется расшифровка MitM.
Правила перезаписи тела определяются в разделе [Body Rewrite]. К одному запросу может быть применено несколько правил.
[Body Rewrite]
^https://api\.example\.com/response response regex "old-text" "new-text"
^https://api\.example\.com/request request regex "sensitive" "[redacted]"
^https://api\.example\.com/data jsonpath-response jsonpath $.ads null
Формат правила
Каждое правило следует этому общему формату:
<URL regex> [direction] <mode> <pattern> <replacement>
Направление
| Ключевое слово | Описание |
|---|---|
response |
Применить к телу ответа (по умолчанию, если не указано) |
request |
Применить к телу запроса |
Режимы
| Режим | Описание |
|---|---|
regex |
Поиск и замена с использованием регулярного выражения |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
Модификация на основе JSONPath |
Режим Regex
Выполняет стандартный поиск и замену с использованием регулярного выражения в декодированном тексте тела. Использует NSRegularExpression (ICU) с сопоставлением без учета регистра. Замена поддерживает ссылки на группы захвата ($1, $2 и т.д.).
<URL regex> [response|request] regex <pattern> <replacement>
Пример — удаление рекламы из JSON-ответа:
[Body Rewrite]
^https://api\.example\.com/feed response regex "\"ads\":\s*\[.*?\]" "\"ads\":[]"
Пример — очистка тела запроса:
[Body Rewrite]
^https://api\.example\.com/submit request regex "\"password\":\s*\".*?\"" "\"password\":\"[FILTERED]\""
Пример — использование групп захвата для переформатирования данных:
[Body Rewrite]
// Замена "last, first" на "first last"
^https://api\.example\.com/users response regex "\"name\":\s*\"(\\w+),\\s*(\\w+)\"" "\"name\":\"$2 $1\""
Пример — перезапись встроенных URL в теле ответа:
[Body Rewrite]
^https://api\.example\.com response regex "https://old-cdn\\.example\\.com" "https://new-cdn.example.com"
Токены, содержащие пробелы, должны быть заключены в двойные кавычки:
[Body Rewrite]
^https://example\.com response regex "old value with spaces" "new value"
Чтобы включить буквальную двойную кавычку внутри заключенного в кавычки токена, экранируйте ее обратной косой чертой: \".
Режим JSONPath
Модифицирует тела JSON с использованием выражений JSONPath. Поддерживает чтение, установку и удаление значений по указанным путям.
<URL regex> jsonpath-response|jsonpath-request jsonpath <jsonpath-expression> [value]
Поддерживаемый синтаксис JSONPath
| Выражение | Описание |
|---|---|
$.key |
Доступ к свойству объекта |
$.key.subkey |
Доступ к вложенным свойствам |
$[0] |
Доступ к элементу массива по индексу |
$.key[0].subkey |
Смешанный доступ к объекту и массиву |
$.items[*].name |
Подстановочный знак: все элементы в массиве |
$.*.value |
Подстановочный знак: все свойства |
Типы значений
| Значение | Результат |
|---|---|
"string" |
Установить строковое значение |
42 |
Установить целое число |
3.14 |
Установить число с плавающей точкой |
true |
Установить булево значение true |
false |
Установить булево значение false |
null или опущено |
Удалить путь |
Пример — установка поля JSON:
[Body Rewrite]
^https://api\.example\.com/profile jsonpath-response jsonpath $.user.name "Anonymous"
Пример — удаление поля JSON:
[Body Rewrite]
^https://api\.example\.com/data jsonpath-response jsonpath $.tracking null
Пример — модификация с подстановочным знаком:
[Body Rewrite]
^https://api\.example\.com/list jsonpath-response jsonpath $.items[*].hidden true
Практические примеры
Удаление параметров отслеживания из JSON-ответов
Удаление полей trackingId и sessionId из всех API-ответов:
[Body Rewrite]
^https://api\.example\.com/ jsonpath-response jsonpath $.trackingId null
^https://api\.example\.com/ jsonpath-response jsonpath $.sessionId null
Внедрение тега script в HTML-ответы
Добавление пользовательского тега <script> перед </body> на всех HTML-страницах:
[Body Rewrite]
^https://www\.example\.com/ response regex "</body>" "<script>console.log('injected')</script></body>"
Скрытие конфиденциальных полей в журналах запросов
Замена ключей API и токенов в исходящих телах запросов до их достижения сервера:
[Body Rewrite]
^https://api\.example\.com/ request regex "\"apiKey\":\s*\"[^\"]+\"" "\"apiKey\":\"[REDACTED]\""
^https://api\.example\.com/ request regex "\"token\":\s*\"[^\"]+\"" "\"token\":\"[REDACTED]\""
Нормализация форматов дат в ответах
Замена дат ISO на более короткий формат:
[Body Rewrite]
^https://api\.example\.com/ response regex "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z" "$1/$2/$3 $4:$5"
Отключение флагов функций в конфигурации приложения
Принудительная установка всех флагов функций в false в конечной точке конфигурации:
[Body Rewrite]
^https://api\.example\.com/config jsonpath-response jsonpath $.features[*].enabled false
Перезапись URL CDN в кэшированных ответах
Замена всех ссылок на старый CDN новым:
[Body Rewrite]
^https://www\.example\.com/ response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
Конвейер обработки
Перезапись тела автоматически обрабатывает:
- Content-Encoding: Поддерживает
gzipиdeflate. Пропускает неподдерживаемые кодировки. - Transfer-Encoding: Дечанкует chunked transfer encoding перед обработкой.
- Декодирование: Распаковывает тела перед применением правил перезаписи.
- Перекодирование: Пересжимает тела и обновляет
Content-Length. Удаляет заголовокTransfer-Encoding.
Максимальный размер тела для обработки перезаписи составляет 128 КБ по умолчанию. Тела больше этого размера проходят без модификации.
Примечания
- Для HTTPS-трафика должна быть включена расшифровка MitM для соответствующего имени хоста.
- Сопоставление регулярных выражений нечувствительно к регистру. Шаблон замены поддерживает ссылки на группы захвата ICU:
$0(полное совпадение),$1(первая группа),$2(вторая группа) и т.д. - Режим JSONPath применяется только если тело является допустимым JSON.
- Правила перезаписи тела применяются к декодированному (UTF-8) тексту тела.
- Несколько правил могут совпадать и применяться к одному запросу/ответу (они применяются в порядке их определения).
- Когда правило устанавливает или удаляет значение через JSONPath, которое не существует, тело остается неизменным.