Добавление правил в профиле приложений¶
Чтобы добавить правило, перейдите во вкладку Правила.
Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.
Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.
При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.
Описание ветки¶
Описание ветки состоит из набора условий для различных параметров HTTP‑запроса, которым он должен удовлетворять, чтобы применились правила, относящиеся к данной ветке. В форме создания правила каждая строка в секции Если в запросе означает отдельное условие, состоящее из трех полей: point, тип и аргумент сравнения. Правила, описанные в ветке, применяются к запросу, только если выполнены все условия.
Для настройки набора условий вы можете использовать как конструктор URI, так и расширенную форму.
Конструктор URI¶
Работа с конструктором URI¶
Конструктор URI позволяет задать набор условий для срабатывания правила с помощью одной строки. В строке задаются метод и адрес запроса, к которому будет применяться правило:
-
Метод запроса необходимо выбрать из выпадающего списка. Если значение не выбрано, правило будет применяться к запросам с любым методом.
-
Адрес запроса необходимо ввести в специальное поле. Строка может иметь следующий формат:
Формат Примеры и значения элементов запроса Полный URI, включая: - Схему (значение не учитывается, можно задать явно в расширенной форме)
- Домен
- Порт
- Путь
- Параметры URI
https://example.com:3000/api/user.php?q=action&w=delete[header, 'HOST']—example.com:3000[path, 0]—api[path, 1]—∅[action_name]—user[action_ext]—php[query, 'q']—action[query, 'w']—delete
URI с неполным набором компонентов example.com/api/user[header, 'HOST']—example.com[path, 0]—api[path, 1]—∅[action_name]—user[action_ext]—∅
http://example.com/api/clients/user/?q=action&w=delete[header, 'HOST']—example.com[path, 0]—api[path, 1]—clients[path, 2]—∅[action_name]—user[query, 'q']—action[query, 'w']—delete
/api/user`[header, 'HOST']— любое значение[path, 0]—api[path, 1]—∅[action_name]—user[action_ext]—∅
URI с *для обозначения компонента с любым значением, кроме пустогоexample.com/*/create/*.*[header, 'HOST']—example.com[path, 0]— любое значение, кроме пустого (скрыто в расширенной форме редактирования)[path, 1]—create[path, 2]—∅[action_name]— любое значение, кроме пустого (скрыто в расширенной форме редактирования)[action_ext]— любое значение, кроме пустого (скрыто в расширенной форме редактирования) Совпадет с
example.com/api/create/user.php.
Не совпадет сexample.com/create/user.phpиexample.com/api/create.URI с **для обозначения любого количества компонентов, в том числе отсутствияexample.com/**/user[header, 'HOST']—example.com[action_name]—user[action_ext]—∅Совпадет с
example.com/api/create/user,example.com/api/userиexample.com/user.
Не совпадет сexample.com/user/index.php,example.com/api/user/index.phpиexample.com/api/user/?w=delete.example.com/api/**/*.*[header, 'HOST']—example.com[path, 0]—api[action_name]— любое значение, кроме пустого (скрыто в расширенной форме редактирования)[action_ext]— любое значение, кроме пустого (скрыто в расширенной форме редактирования) Совпадет с
example.com/api/create/user.phpиexample.com/api/user/create/index.php.
Не совпадет сexample.com/api,example.com/api/userиexample.com/api/create/user.php?w=delete.URI с регулярным выражением в качестве значения компонента (регулярное выражение необходимо указывать в {{}})example.com/user/{{[0-9]}}[header, 'HOST']—example.com[path, 0]—user[path, 1]—∅[action_name]—[0-9][action_ext]—∅Совпадет с
example.com/user/3445.
Не совпадет сexample.com/user/3445/888иexample.com/user/3445/index.php.
Строка, введенная в конструкторе URI, автоматически преобразовывается в набор условий для следующих элементов запроса:
-
method -
header. С помощью конструктора URI можно задать только заголовокHOST. -
path,action_name,action_ext. Перед сохранением правила убедитесь, что значения этих элементов определены одним из следующих способов:- Явное значение для определенного номера
path+action_name+action_ext(опционально) - Явное значение для
action_name+action_ext(опционально) - Явное значение для определенного номера
pathбезaction_nameиaction_ext
- Явное значение для определенного номера
-
query
Вы можете завершить редактирование значения, заданного в конструкторе URI, в расширенной форме. В том числе добавить элементы запросы, которые не поддерживаются в конструкторе URI.
Использование подстановочных знаков (wildcards)¶
Можно ли использовать подстановочные знаки (wildcards) при работе с конструктором URI в Вебмониторэкс? Нет и да. "Нет" означает, что вы не можете использовать их классически – для замены других симовлов или их последовательностей. "Да" означает, что вы можете достигнуть аналогичного результата, действуя так:
-
В элементах URI используйте регулярные выражения вместо подстановочных знаков.
-
Используйте знаки
*или**в самой строке URI в значении "один или несколько компонентов" (смотрите примеры в разделе выше).
Детали
Синтаксис регулярных выражений отличается от классических подстановочных знаков (wildcards), но позволяет достигнуть тех же результатов. Например, вы хотите получить маску, соответствующую адресам:
-
something-1.example.com/user/create.comи -
anything.something-2.example.com/user/create.com
...которую с классическими подстановочными знаками (wildcards) вы бы попытались получить примерно так:
*.example.com/user/create.com
Однако в конструкторе URI, something-1.example.com/user/create.com будет преобразован в:
...где something-1.example.com является элементом header-HOST. Мы упоминали, что классические подстановочные знаки (wildcard) не могут быть использованы внутри элементов запроса. Поэтому понадобится регулярное выражение: установите для элемента header-HOST тип условия REGEX и затем задайте регулярное выражение, используя синтаксис PIRE:
-
Не используйте
*в значении "любое количество символов". -
Поместите все
., которые должны быть интерпретированы буквально как точки, в квадратные скобки:something-1[.]example[.]com -
Используйте
.без скобок как замену "1 любого символа" и*после нее как квантификатор "0 или более повторений предшествующего", то есть.*и:.*[.]example[.]com -
Добавьте
$в конце выражения, чтобы обозначить, что строка должна заканчиваться тем, что вы ввели:.*[.]example[.]com$Более простой способ
Вы можете пропустить
.*и оставить только[.]example[.]com$. В обоих случаях Вебмониторэкс будет считать, что перед[.]example[.]com$может встречаться любой символ любое количество раз.
Расширенная форма редактирования¶
Point¶
Поле point содержит параметр, значение которого необходимо взять для сравнения. В данный момент поддерживаются не все point'ы, которые может анализировать WAF‑нода.
-
application — ID приложения.
-
proto — версия HTTP‑протокола (1.0, 1.1, 2.0, ...).
-
scheme — http или https.
-
uri — часть URL запроса без адреса домена (например,
/blogs/123/index.php?q=aaaдля запроса, отправленного на адресhttp://example.com/blogs/123/index.php?q=aaa). -
path, action_name, action_ext — иерархическая часть URI, где:
- path — массив с частями URI, разделенными
/, кроме последней. Если URI состоит только из одной части, массив будет пустым. - action_name — последняя часть URL после
/и до первой точки (.). Всегда присутствует в запросе, даже если значение — пустая строка. - action_ext — последняя часть URI после первой точки (
.). Может отсутствовать в запросе.
- path — массив с частями URI, разделенными
-
query — параметры URL (параметры строки запроса).
-
header — заголовки запроса. При вводе имени заголовка, наиболее частые значения отображаются в выпадающем списке. Например:
HOST,USER-AGENT,COOKIE,X-FORWARDED-FOR,AUTHORIZATION,REFERER,CONTENT-TYPE. -
method — методы запроса. Если значение не задано в явном виде, правило применяется к запросам, отправленным любым методом.
Тип условия EQUAL (=)¶
Значение point'а должно точно совпадать с аргументом сравнения. Например, с example совпадет только example.
Тип условия EQUAL для значения заголовка HOST
Чтобы правила покрывали больше запросов, мы ввели ограничение на использование типа условия EQUAL с заголовком HOST. Вместо типа EQUAL мы рекомендуем использовать IEQUAL, который допускает значения параметра в любом регистре.
Если у вас есть созданное правило с типом условия EQUAL, он будет автоматически заменен на IEQUAL.
Тип условия IEQUAL (Aa)¶
Значение point'а должно совпадать с аргументом сравнения в любом регистре. Например, с example совпадет example, ExAmple, exampLe и т.д.
Тип условия REGEX** (.*)¶
Значение point'а должно соответствовать регулярному выражению.
Синтаксис регулярных выражений¶
Для поиска совпадений строк с регулярными выражениями применяется библиотека PIRE, которая поддерживает стандартный синтаксис регулярных выражений с некоторыми особенностями. Синтаксис описан ниже и в README‑файле в репозитории PIRE.
Синтаксис регулярных выражений
Символы, которые не требуют экранирования:
- Строчная латиница:
a b c d e f g h i j k l m n o p q r s t u v w x y z - Прописная латиница:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - Цифры:
0 1 3 4 5 6 7 8 9 - Специальные символы:
! " # % ' , - / : ; < = > @ ] _ ` } - Пробелы
Символы, которые необходимо поместить в [] вместо экранирования через \:
. $ ^ { [ ( | ) * + ? \ & ~
Символы, которые необходимо конвертировать в ASCII по стандарту ISO‑8859:
- Символы UTF‑8 (например, русская буква
тв ASCII —Ñ)
Группы символов:
.для всех символов кроме перехода на новую строку()для группировки регулярных выражений, поиска совпадения со значением в(), установки приоритета условий в регулярном выражении[]для одного из символов в[](чувствительно к регистру); группа может использоваться для специфичных случаев:- для игнорирования регистра (например,
[cC]) [a-z]для совпадения с любой буквой из строчной латиницы[A-Z]для совпадения с любой буквой из прописной латиницы[0-9]для совпадения с любой цифрой[a-zA-Z0-9\.]для совпадения с любой буквой из строчной или прописной латиницы, цифрой или точкой
- для игнорирования регистра (например,
Логические операторы:
~для инверсии (=NOT). При этом инвертируемое выражение и логический оператор должны быть помещены в(), например:^(~(a))$|для дизъюнкции (=OR)&для конъюнкции (=AND)
Символы для обозначения границ строки:
^для начала строки$для конца строки
Квантификаторы:
*для 0 или более повторений предшествующего регулярного выражения+для 1 или более повторений предшествующего регулярного выражения?для 0 или 1 повторения предшествующего регулярного выражения{m}дляmповторений предшествующего регулярного выражения{m,n}для повторений предшествующего регулярного выражения отmдоnраз; еслиnопущено, отmдо бесконечности повторений
Комбинации символов, которые работают с особенностями:
^.*$эквивалентно^.+$(пустая строка не совпадет с^.*$)^.?$,^.{0,}$,^.{0,n}$эквивалентно^.+$
Временно не поддерживаются:
- Классы символов:
\Wдля небуквенного символа,\wдля буквенного символа,\Dдля нецифрового символа,\dдля цифрового символа,\Sдля непробельного символа,\sдля пробела
Не поддерживаются:
- Трехзначный восьмеричный код:
\NNN,\oNNN,\ONNN \cNзадание управляющих символов через\c(например,\cCдля CTRL+C)\Aдля начала строки\zдля конца строки\bдля границы строки (до или после пробельного символа)- Ленивые квантификаторы:
??,*?,+? - Условные конструкции
Тестирование регулярных выражений
Для проверки регулярных выражений вы можете использовать утилиту cpire на поддерживаемой версии Debian или Ubuntu:
-
Добавьте репозиторий Вебмониторэкс:
sudo apt update sudo apt install dirmngr curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add - sh -c "echo 'deb https://repo.webmonitorx.ru/debian/webmonitorx-node buster/4.10/' | sudo tee /etc/apt/sources.list.d/wmx.list" sudo apt updatesudo apt update sudo apt install dirmngr curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add - sh -c "echo 'deb https://repo.webmonitorx.ru/debian/webmonitorx-node bullseye/4.10/' | sudo tee /etc/apt/sources.list.d/wmx.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/webmonitorx-node bionic/4.10/' | sudo tee /etc/apt/sources.list.d/wmx.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add - sh -c "echo 'deb https://repo.webmonitorx.ru/ubuntu/webmonitorx-node focal/4.10/' | sudo tee /etc/apt/sources.list.d/wmx.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wmx.gpg | sudo apt-key add - sh -c "echo 'deb https://repo.webmonitorx.ru/ubuntu/webmonitorx-node jammy/4.10/' | sudo tee /etc/apt/sources.list.d/wmx.list" sudo apt update -
Установите утилиту cpire:
sudo apt install libcpire-utils -
Запустите улититу cpire:
cpire-runner -r '<YOUR_REGULAR_EXPRESSION>'/opt/wallarm/usr/bin/cpire-runner.sh -r '<YOUR_REGULAR_EXPRESSION>'
-
Введите строку для проверки совпадения с регулярным выражением. Утилита вернет ответ:
0, если строка совпадает с регулярным выражениемFAIL, если строка не совпадает с регулярным выражением- Сообщение об ошибке, если регулярное выражение невалидное
Особенности обработки символа
\Если в регулярном выражении есть символ
\, экранируйте его через[]и\(например,[\\]).
Примеры регулярных выражений, добавленных через Консоль управления Вебмониторэкс
-
Для совпадения со строкой, которая содержит
/.git/[.]git -
Для совпадения со строкой, которая содержит
.example.com[.]example[.]com -
Для совпадения со строкой, которая заканчивается на
/.example.*.com, где*- любой символ любое количество раз/[.]example[.].*[.]com$ -
Для совпадения с любым IP‑ адресом кроме 1.2.3.4 и 5.6.7.8
^(~((1[.]2[.]3[.]4)|(5[.]6[.]7[.]8)))$ -
Для совпадения со строкой, которая заканчивается на
/.example.com.php/[.]example[.]com[.]php$ -
Для совпадения со строкой, которая содержит
sqlmapс буквами любого регистра:sqLmAp,SqLMapи т.д.[sS][qQ][lL][mM][aA][pP] -
Для совпадения со строкой, которая содержит одно или несколько значений:
admin\.exe,admin\.bat,admin\.sh,cmd\.exe,cmd\.bat,cmd\.sh(admin|cmd)[\].(exe|bat|sh) -
Для совпадения со строкой, которая содержит одно или несколько значений:
onmouseс буквами любого регистра,onloadс буквами любого регистра,win\.ini,prompt[oO][nN][mM][oO][uU][sS][eE]|[oO][nN][lL][oO][aA][dD]|win[\].ini|prompt -
Для совпадения со строкой, которая начинается с
Mozilla, но не содержит1aa875F49III^(Mozilla(~(.*1aa875F49III.*)))$ -
Для совпадения со строкой, которая имеет одно из значений:
python‑requests/,PostmanRuntime/,okhttp/3.14.0,node-fetch/1.0^(python-requests/|PostmanRuntime/|okhttp/3.14.0|node-fetch/1.0)
Тип условия ABSENT (∅)¶
В запросе не должно быть указанного point'а. Аргумент сравнения в этом случае не используется.
Правило¶
В секции Тогда располагается описание добавляемого правила обработки запросов.
Поддерживаются следующие правила:


