Глава 43. Операторы сравнения¶
CPL поддерживает несколько операторов сравнения значений. Выбор оператора зависит от типа условия (строка, число, IP-адрес).
42.1. = — точное совпадение¶
Основной оператор. Семантика зависит от типа значения:
- Строки — точное совпадение (регистронезависимо для доменов и методов)
- IP-адреса — совпадение адреса или принадлежность подсети (CIDR)
- Числа — точное числовое равенство
- Шаблоны — glob-совпадение при использовании
*и?
url.domain=example.com ; строковое совпадение
http.method=GET ; строковое совпадение
proxy.port=8080 ; числовое совпадение
client.address=10.0.0.0/8 ; CIDR-совпадение
url.domain=*.example.com ; glob-шаблон
42.2. != — не равно¶
Отрицание совпадения. Эквивалентно =! (восклицательный знак после знака равенства):
url.domain!=blocked.com ; не равно
client.address!=10.0.0.0/8 ; не в подсети
http.method!=DELETE ; метод не DELETE
Альтернативная запись:
42.3. .regex= — регулярное выражение¶
Проверка значения по регулярному выражению. Регулярные выражения всегда заключаются в кавычки. Синтаксис — Rust regex (совместим с PCRE для большинства конструкций):
url.host.regex="^www\d+\.example\.com$"
url.path.regex="^/api/v[0-9]+/"
request.header.User-Agent.regex=".*[Bb]ot.*"
http.response.body.regex="(password|secret|token)\s*[:=]"
| Элемент | Значение |
|---|---|
. |
Любой символ |
*, +, ? |
Квантификаторы (0+, 1+, 0 или 1) |
[abc], [^abc] |
Классы символов / отрицание |
\d, \w, \s |
Цифра, слово, пробел |
^, $ |
Начало / конец строки |
(group) |
Группировка |
(?i) |
Регистронезависимый режим |
\| |
Альтернатива (ИЛИ) |
42.4. .substring= — поиск подстроки¶
Проверка наличия подстроки в значении поля. Регистрозависимый поиск:
request.header.Cookie.substring=session_id
request.header.User-Agent.substring=Chrome
http.request.body.contains="<script"
42.5. .prefix= / .suffix= — префикс / суффикс¶
Проверка начала или конца значения:
url.host.prefix=api ; api.example.com, api-v2.corp
url.host.suffix=.corp ; internal.corp, wiki.corp
url.path=/api/v2 ; /api/v2/users, /api/v2/orders
42.6. Диапазоны (N..M) — инклюзивные диапазоны¶
Оба граничных значения включены в диапазон:
hour=9..17 ; с 9 до 17 включительно
server.port=80..8080 ; порты 80-8080
http.response.code=200..299 ; коды 2xx
date.range=2026-01-01..2026-12-31 ; весь 2026 год
weekday=1..5 ; понедельник-пятница
42.7. Открытые диапазоны (N.. и ..N)¶
Для числовых сравнений «больше или равно» и «меньше или равно» используются открытые диапазоны. Операторы >, <, >=, <= не поддерживаются в CPL.
N.. — больше или равно N:
http.request.body.size=10485760.. ; >= 10 МБ (10*1024*1024)
http.response.code=400.. ; все коды ошибок (400+)
hour=18.. ; с 18:00 и позже
..N — меньше или равно N:
http.request.body.size=..1024 ; <= 1 КБ
http.response.code=..299 ; все успешные коды (100-299)
hour=..8 ; до 9:00 (0-8)
Комбинирование открытых диапазонов для «строго больше» / «строго меньше»:
Поскольку диапазоны инклюзивны, для «строго больше 100» используйте 101.., а для «строго меньше 100» — ..99.
42.8. Списки значений ((val1, val2, ...))¶
Список значений — логическое ИЛИ. Правило совпадает при совпадении с любым элементом списка:
http.method=(GET, POST, PUT)
url.extension=(exe, msi, bat, cmd, ps1)
category=(Malware, Phishing, "Adult Content")
weekday=(1,2,3,4,5)
geo.dst.country=(KP, IR, SY)
http.response.code=(403, 404, 500, 502, 503)
Разделители в списках: запятая, пробел или ||:
; Все три записи эквивалентны:
url.extension=(exe, msi, bat)
url.extension=(exe msi bat)
url.extension=(exe || msi || bat)
Значения с пробелами заключаются в кавычки: