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

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

Альтернативная запись:

url.domain=!blocked.com                    ; эквивалентно url.domain!=blocked.com

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)

Значения с пробелами заключаются в кавычки:

category=("Adult Content", "Illegal Activities", Malware)