Добавление правил в профиле приложений¶
Чтобы добавить правило, перейдите во вкладку Правила.
Правила можно добавлять к уже существующим или к новым веткам. Ветки можно создавать с нуля или на основе одной из уже имеющихся веток.
Для добавления правила к существующей ветке нажмите на кнопку Добавить правило (появится во всплывающем меню справа после наведения мыши на строку с описанием ветки). Вы также можете сделать это на странице правил этой ветки.
При необходимости ветку, в которую будет добавлено правило, можно изменить. Для этого в форме создания правила нажмите на надпись Если в запросе и измените условия, описывающие ветку. Если такой ветки не существует, то она будет создана, а отображение структуры приложений обновится.
Описание ветки¶
Описание ветки состоит из набора условий для различных параметров HTTP‑запроса, которым он должен удовлетворять, чтобы применились правила, относящиеся к данной ветке. В форме создания правила каждая строка в секции Если в запросе означает отдельное условие, состоящее из трех полей: point, тип и аргумент сравнения. Правила, описанные в ветке, применяются к запросу, только если выполнены все условия.
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¶
Значение 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/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node stretch/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sudo apt updatesudo apt install dirmngr curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node stretch/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node stretch-backports/2.18/' | sudo tee --append /etc/apt/sources.list.d/wallarm.list" # for correct Вебмониторэкс node operation, uncomment the following line in /etc/apt/sources.list`: # deb http://deb.debian.org/debian stretch-backports main contrib non-free sudo apt updatesudo apt update sudo apt install dirmngr curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/debian/wallarm-node buster/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/wallarm-node xenial/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/wallarm-node bionic/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sudo apt updatesudo apt update curl -fsSL https://repo.webmonitorx.ru/wallarm.gpg | sudo apt-key add - sh -c "echo 'deb http://repo.webmonitorx.ru/ubuntu/wallarm-node focal/2.18/' | sudo tee /etc/apt/sources.list.d/wallarm.list" sudo apt update
-  Установите утилиту cpire: sudo apt install libcpire-utils
-  Запустите улититу cpire: cpire-runner -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'а. Аргумент сравнения в этом случае не используется.
Правило¶
В секции Тогда располагается описание добавляемого правила обработки запросов.
Поддерживаются следующие правила:
