Глава 11. Условия тела запроса/ответа¶
Условия этой главы позволяют инспектировать размер и содержимое тела HTTP-запросов и ответов, а также проверять тип контента. Эти условия являются ресурсоёмкими, так как требуют буферизации тела сообщения.
Примечание: Условие
http.request.body.size=соответствует BlueCoat . Остальные условия тела (http.request.body.contains=,http.response.body.contains=,http.response.body.regex=) являются расширениями Redcoat.
11.1. http.request.body.size=¶
Проверяет размер тела HTTP-запроса в байтах. Позволяет контролировать HTTP-транзакции на основе размера тела запроса.
В отличие от http.request.body.max_size() в BlueCoat (который принудительно ограничивает максимальный размер), это условие только тестирует размер и не выполняет принудительного ограничения.
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
где <значение>:
| Форма | Описание | Пример |
|---|---|---|
N |
Точное количество байт | http.request.body.size=1024 |
N..M |
Диапазон от N до M байт (включительно) | http.request.body.size=1000..10000 |
N.. |
Больше или равно N байт | http.request.body.size=10485760.. |
..M |
Меньше или равно M байт | http.request.body.size=..5000 |
Допустимые слои: <Cache>, <Exception>, <Proxy>
Транзакции: HTTP-запросы с телом (POST, PUT, PATCH)
Примеры:
<Proxy>
; Логировать запросы с телом > 10 МБ
http.request.body.size=10485760.. access_log[large_request](yes)
; Блокировать загрузки размером 0 байт (пустое тело)
http.method=POST http.request.body.size=0 deny
; Разрешить API-запросы с телом от 1 до 100 КБ
url.path=/api http.request.body.size=1..102400 ALLOW
См. также: content.size= (11.6) — размер контента ответа
11.1a. http.response.data=¶
Инспектирует первые N байт тела HTTP-ответа, полученного от origin-сервера. Позволяет проверять magic bytes (file signatures), начальные строки контента и другие паттерны в начале ответа.
Синтаксис и семантика — как в BlueCoat.
Условие фазы тела ответа. Это условие оценивается после получения тела ответа от вышестоящего сервера. Правила с этим условием пропускаются на этапе обработки запроса и оцениваются после получения тела: для буферизованных ответов (<1 МБ) — целиком, для потоковых ответов (>1 МБ) — по первому полученному фрагменту. Проверка происходит до начала передачи данных клиенту.
Синтаксис:
где:
N— количество байт для инспекции (1..65536). BlueCoat ограничивает 1..256, Redcoat поддерживает расширенный диапазон.string_modifier— режим сравнения:
| Модификатор | Описание | Пример |
|---|---|---|
substring |
Подстрока (по умолчанию) | http.response.data.256.substring="blocked" |
exact |
Точное совпадение N байт | http.response.data.2.exact="MZ" |
prefix |
Начинается с | http.response.data.100.prefix="<!doctype" |
suffix |
Заканчивается на | http.response.data.100.suffix="</html>" |
regex |
Регулярное выражение | http.response.data.256.regex="<script[^>]*>" |
hex |
Шестнадцатеричная сигнатура | http.response.data.8.hex="\89PNG\0D\0A\1A\0A" |
case_sensitive— включает регистрозависимое сравнение (по умолчанию сравнение регистронезависимое):
Hex-формат: \XX = байт с hex-значением XX. Литеральные символы сохраняются как есть. \\ = литеральный обратный слеш. Используется для детекции бинарных файлов по magic bytes.
| Сигнатура | Hex-паттерн | Формат файла |
|---|---|---|
\89PNG\0D\0A\1A\0A |
89 50 4E 47 0D 0A 1A 0A | PNG image |
\FF\D8\FF |
FF D8 FF | JPEG image |
%PDF |
25 50 44 46 | PDF document |
MZ |
4D 5A | Windows PE executable |
PK\03\04 |
50 4B 03 04 | ZIP archive |
\7FELF |
7F 45 4C 46 | ELF binary (Linux) |
Допустимые слои: <Cache>, <Exception>, <Proxy>.
Транзакции: HTTP proxy.
Обработка (три случая):
| Случай | Условие | Источник данных | Когда проверяется |
|---|---|---|---|
| Буферизованный ответ | Content-Length < 1 МБ | тело ответа целиком после получения | до начала передачи клиенту |
| Потоковый ответ | Content-Length >= 1 МБ | первый полученный фрагмент тела | до начала передачи клиенту |
| Ответ из кеша | Ответ из кеша | тело из кешированного ответа | до начала передачи клиенту |
Во всех трёх случаях проверка происходит до отправки данных клиенту. Если http.response.data= не используется в политике, дополнительных накладных расходов нет.
Примеры:
<Proxy>
; Заблокировать ответы, начинающиеся с "MZ" (Windows executable)
DENY http.response.data.2.case_sensitive="MZ"
<Proxy>
; Заблокировать PNG файлы по magic bytes
DENY http.response.data.8.hex="\89PNG\0D\0A\1A\0A"
<Proxy>
; Заблокировать ответы, содержащие "Example Domain" в первых 256 байтах
http.response.data.256.substring="Example Domain" deny
ALLOW
<Proxy>
; Только 10 байт: не найдёт "Domain" если оно дальше
http.response.data.10.substring="Domain" deny
ALLOW
Ограничения:
- Для потоковых ответов (>1 МБ) инспектируется только первый сетевой фрагмент (~1460 байт). Этого достаточно для magic bytes и заголовков файлов.
- При ответе из кеша инспекция работает на кешированном теле, но deny в фазе ответа пока не проходит через слой <Exception> (планируется).
См. также: http.request.body.size= (11.1), http.response.body.contains= (11.3), http.response.body.regex= (11.4)
11.2. http.request.body.contains=¶
Расширение Redcoat. В BlueCoat отсутствует. Ближайший аналог —
http.request.data.N[.string_modifier]=criterion, который инспектирует первые N байт тела запроса (от 1 до 65536) с настраиваемым модификатором строки (regex, substring, prefix, suffix, exact, count). Условиеhttp.request.body.contains=в Redcoat выполняет поиск подстроки по всему телу запроса без ограничения на количество байт.
Проверяет, содержит ли тело HTTP-запроса указанную подстроку или одну из подстрок списка.
Синтаксис:
где <шаблон> — строка для поиска (поиск подстроки). Поддерживаются:
| Форма | Описание | Пример |
|---|---|---|
строка |
Точная подстрока | http.request.body.contains=malicious |
строка* |
Wildcard-шаблон | http.request.body.contains=password* |
regex:выражение |
Регулярное выражение | http.request.body.contains=regex:\bpassword\b |
* |
Любое содержимое (всегда true) | http.request.body.contains=* |
(a, b, c) |
Список (OR — совпадение любого) | http.request.body.contains=(password, secret) |
Допустимые слои: <Proxy>
Транзакции: HTTP-запросы с телом
Примеры:
<Proxy>
; Блокировать запросы с подозрительным содержимым
http.request.body.contains=(malicious_payload, <script>, eval() deny
; Логировать запросы, содержащие конфиденциальные данные
http.request.body.contains=(password, credit_card, ssn) access_log[sensitive](yes)
; Блокировать SQL-инъекции через regex
http.request.body.contains=regex:(?i)(union\s+select|drop\s+table) deny
Производительность: Инспекция тела требует полной буферизации запроса в памяти. Для высоконагруженных прокси рекомендуется комбинировать с
http.request.body.size=для ограничения объёма инспектируемых данных, или использовать ICAP для вынесения анализа на отдельный сервер.
См. также: http.response.body.contains= (11.3), http.response.body.regex= (11.4)
11.3. http.response.body.contains=¶
Расширение Redcoat. BlueCoat предоставляет
http.response.data.N[.modifier]=pattern(раздел 11.1a) для инспекции первых N байт ответа. Условиеhttp.response.body.contains=в Redcoat является расширением, выполняющим поиск подстроки по всему телу ответа (не только первым N байтам).
Проверяет, содержит ли тело HTTP-ответа указанную подстроку или одну из подстрок списка.
Синтаксис:
где <шаблон> — строка для поиска. Поддерживаются те же формы, что и для http.request.body.contains=:
| Форма | Описание | Пример |
|---|---|---|
строка |
Точная подстрока | http.response.body.contains=confidential |
строка* |
Wildcard-шаблон | http.response.body.contains=error* |
regex:выражение |
Регулярное выражение | http.response.body.contains=regex:\d{16} |
* |
Любое содержимое | http.response.body.contains=* |
(a, b, c) |
Список (OR) | http.response.body.contains=(secret, classified) |
Допустимые слои: <Cache>, <Exception>
Транзакции: HTTP-ответы
Примеры:
<Cache>
; Не кешировать ответы с конфиденциальным содержимым
http.response.body.contains=(confidential, internal_only) no_cache
<Exception>
; Показать предупреждение при обнаружении номеров кредитных карт
http.response.body.contains=regex:\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b exception(credit_card_warning)
См. также: http.request.body.contains= (11.2), http.response.body.regex= (11.4)
11.4. http.response.body.regex=¶
Расширение Redcoat. В BlueCoat отсутствует. Ближайший аналог —
http.response.data.N.regex=pattern, который применяет regex к первым N байтам ответа (N от 1 до 256). Условиеhttp.response.body.regex=в Redcoat применяет регулярное выражение ко всему телу ответа.
Проверяет тело HTTP-ответа регулярным выражением.
Синтаксис:
Значение — одно регулярное выражение в кавычках. В отличие от http.response.body.contains=, это условие не поддерживает списки (a, b) — только одно выражение.
Допустимые слои: <Cache>, <Exception>
Транзакции: HTTP-ответы
Примеры:
<Exception>
; Обнаружение inline-скриптов в ответах
http.response.body.regex="<script[^>]*>.*</script>" exception(inline_script_warning)
; Обнаружение номеров кредитных карт (формат Visa/MasterCard)
http.response.body.regex="credit[_-]?card[_-]?number" exception(dlp_alert)
; Обнаружение email-адресов
http.response.body.regex="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" exception(email_detected)
Производительность: Regex по всему телу ответа — ресурсоёмкая операция. Для больших ответов (мегабайты и более) рекомендуется сначала фильтровать по
content-type=илиresponse.header.Content-Length=, чтобы ограничить количество инспектируемых ответов.
См. также: http.response.body.contains= (11.3), http.request.body.contains= (11.2)
11.5. content-type=¶
Расширение Redcoat. В BlueCoat отдельного условия
content-typeнет. Это удобный shortcut дляrequest.header.Content-Type=.
Проверяет значение HTTP-заголовка Content-Type запроса.
Синтаксис:
где <тип> — MIME-тип. Поддерживаются:
| Форма | Описание | Пример |
|---|---|---|
тип/подтип |
Точное совпадение | content-type=application/json |
тип/* |
Wildcard по подтипу | content-type=image/* |
(a, b) |
Список (OR) | content-type=(text/html, text/plain) |
Примечание: Это условие проверяет Content-Type запроса (заголовок, отправленный клиентом), а не ответа сервера. Для проверки Content-Type ответа используйте
response.header.Content-Type=.
Допустимые слои: <Proxy>
Транзакции: HTTP-запросы с заголовком Content-Type
Примеры:
<Proxy>
; Блокировка загрузки исполняемых файлов через POST
http.method=POST content-type=application/octet-stream deny
; Разрешить только JSON для API
url.path=/api http.method=POST content-type!=application/json deny
; Блокировать multipart-загрузки на определённый путь
url.path=/public content-type=multipart/form-data deny
; Логировать XML-запросы
content-type=(application/xml, text/xml) access_log[xml_request](yes)
См. также: response.header.Content-Type= (Глава 10) — Content-Type ответа
11.6. content.size=¶
Статус: планируется. Использование в CPL-файле приведёт к ошибке парсинга.
Проверяет размер контента ответа в байтах.
Аналог BlueCoat: Частично соответствует http.response.data.N= в части контроля размера ответа, но выделен в отдельное условие для размера.
Синтаксис (планируемый):
где <значение>:
| Форма | Описание | Пример |
|---|---|---|
N |
Точное количество байт | content.size=1048576 |
N..M |
Диапазон от N до M байт | content.size=1000000..10000000 |
Допустимые слои (планируемые): <Proxy>, <Cache>
Примеры (планируемые):
<Proxy>
; Блокировать скачивание файлов > 100 МБ
content.size=104857600..18446744073709551615 deny
<Cache>
; Не кешировать ответы > 50 МБ
content.size=52428800..18446744073709551615 no_cache
См. также: http.request.body.size= (11.1) — размер тела запроса