Перейти к содержанию

Глава 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.

Синтаксис:

http.request.body.size=<значение>

где <значение>:

Форма Описание Пример
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 МБ) — по первому полученному фрагменту. Проверка происходит до начала передачи данных клиенту.

Синтаксис:

http.response.data.N[.string_modifier][.case_sensitive]=pattern

где:

  • 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 — включает регистрозависимое сравнение (по умолчанию сравнение регистронезависимое):
http.response.data.256.substring.case_sensitive="SECRET"

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=<шаблон>
http.request.body.contains=(<шаблон1>, <шаблон2>, ...)

где <шаблон> — строка для поиска (поиск подстроки). Поддерживаются:

Форма Описание Пример
строка Точная подстрока 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.response.body.contains=<шаблон>
http.response.body.contains=(<шаблон1>, <шаблон2>, ...)

где <шаблон> — строка для поиска. Поддерживаются те же формы, что и для 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.regex="<регулярное_выражение>"

Значение — одно регулярное выражение в кавычках. В отличие от 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 запроса.

Синтаксис:

content-type=<тип>
content-type=(<тип1>, <тип2>, ...)

где <тип> — 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= в части контроля размера ответа, но выделен в отдельное условие для размера.

Синтаксис (планируемый):

content.size=<значение>

где <значение>:

Форма Описание Пример
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) — размер тела запроса