Используйте XML-условие, когда нужно проверить конкретное значение внутри XML-тела запроса: узел, атрибут, элемент списка или значение по XPath.
Если данные находятся внутри XML-документа, выберите Содержание запроса → XML. Для обычного текста, форм и multipart-запросов используйте другие типы условий.
Таблица 1. Когда выбирать XML-условие
| Сценарий | Что выбрать |
|---|---|
| Нужно проверить значение внутри XML-документа | Содержание запроса → XML |
| Нужно проверить обычный текст без XML-структуры | Содержание запроса → Тело запроса |
Нужно проверить форму application/x-www-form-urlencoded |
Содержание запроса → Поле формы |
| Нужно проверить файл или часть multipart-запроса | Содержание запроса → Multipart |
XML-условие применяется только к запросам с XML Content-Type. Перед настройкой проверьте заголовок Content-Type, чтобы правило срабатывало на нужные запросы.
Таблица 2. Content-Type для XML-условий
Заголовок Content-Type |
Подходит для XML-условия |
|---|---|
text/xml |
Да |
application/xml |
Да |
application/soap+xml |
Да |
application/*+xml |
Да, например application/vnd.company.order+xml |
application/json |
Нет |
multipart/form-data |
Нет. Используйте Multipart |
application/x-www-form-urlencoded |
Нет. Используйте Поле формы |
Где и как добавить XML-условие
XML-условие добавляется при создании или редактировании правила WAF.
В блоке условий выберите Область проверки → Содержание запроса, затем в поле Тип тела выберите XML.
После выбора типа тела появятся поля для настройки XML-проверки: XPath, Оператор и поле значения.
Действия правила для XML-условия
Для XML-условий доступны те же действия, что и для других условий. Выбирайте действие в зависимости от задачи: заблокировать запрос, разрешить легитимный сценарий или отключить отдельные WAF ID.
Таблица 3. Действия правила для XML-условия
| Действие | Когда использовать | Что важно учесть |
|---|---|---|
| Запретить | Нужно заблокировать XML-запрос по значению узла или атрибута. | Указывайте точный XPath, чтобы правило не срабатывало на лишние XML-запросы. |
| Разрешить | Нужно убрать ложное срабатывание для легитимного XML-запроса. | Добавляйте узкие условия: приложение, URL, метод, источник запроса и точный XPath. |
| Отключить правила по ID | В событии атаки указаны конкретные WAF ID, которые ошибочно сработали на XML-запрос. | Этот вариант обычно безопаснее широкого разрешающего правила, потому что остальные проверки WAF продолжают работать. |
Если один и тот же XML-запрос подходит и под правило Разрешить, и под правило Запретить, приоритет имеет Разрешить. Поэтому разрешающие правила должны быть максимально точными.
Важно: если приложение работает в режиме Мониторинг, правило фиксирует срабатывания, но не блокирует запросы. Для блокировки нужен режим Активная защита.
XPath
XPath указывает, где именно в XML-документе находится значение для проверки. XPath должен быть абсолютным и начинаться с /.
Примеры корректных XPath приведены в таблице 4.
Таблица 4. Примеры XPath
| Что нужно проверить | XPath | Пример значения |
|---|---|---|
| Значение узла | /Envelope/Body/Login/User |
admin |
| Вложенный узел заказа | /order/customer/id |
100500 |
| Узлы списка | /order/items/item/name |
Phone |
| Первый элемент списка | /order/items/item[1]/name |
Phone |
| Элемент с атрибутом | /order/items/item[@type="digital"]/name |
License |
| Значение атрибута | /Envelope/Header/@token |
abc123 |
| SOAP action внутри тела | /Envelope/Body/CreateOrder/action |
create |
| SOAP с префиксами | /soap:Envelope/soap:Body/CreateOrder/action |
create |
| Любой узел на одном уровне | /Envelope/Body/*/User |
admin |
Как выбрать XPath по XML-телу
Перед настройкой правила возьмите пример реального XML-запроса и определите путь к нужному значению. Путь строится от корневого элемента к нужному узлу или атрибуту.
Примеры выбора XPath приведены в таблице 5.
Таблица 5. Как выбрать XPath по XML-телу
| XML-фрагмент | Что проверить | XPath |
|---|---|---|
<order><customer><id>100500</id></customer></order> |
ID клиента | /order/customer/id |
<order id="42"><status>paid</status></order> |
Атрибут заказа | /order/@id |
<item type="digital"><name>License</name></item> |
Имя цифрового товара | /item[@type="digital"]/name |
<items><item><name>Phone</name></item><item><name>Case</name></item></items> |
Любой товар с именем Phone |
/items/item/name |
<items><item><name>Phone</name></item><item><name>Case</name></item></items> |
Только первый товар | /items/item[1]/name |
<soap:Envelope><soap:Body><CreateOrder><action>create</action></CreateOrder></soap:Body></soap:Envelope> |
SOAP action | /soap:Envelope/soap:Body/CreateOrder/action |
Примечание: если в XML используются префиксы, указывайте такие же префиксы в XPath. Например, для SOAP-запроса с префиксом soap: путь должен содержать этот префикс.
Некорректные XPath-варианты
Для XML-условий используйте простые абсолютные пути. Не используйте слишком широкие или сложные XPath: такие условия сложнее контролировать, и они могут сработать не на тех запросах.
Таблица 6. Некорректные XPath-варианты
| Не используйте | Почему | Как заменить |
|---|---|---|
//User |
Такой путь ищет User по всему XML-документу и может сработать слишком широко. |
/Envelope/Body/Login/User |
contains(/order/name, "test") |
Функции в XPath не поддерживаются. | XPath /order/name + оператор Содержит + значение test |
/Envelope/Body/descendant::User |
Оси XPath не поддерживаются. | /Envelope/Body/Login/User |
order/customer/id |
XPath должен начинаться с /. |
/order/customer/id |
/Envelope/Body/*/*/*/*/User |
В пути слишком много wildcard-сегментов *. |
Укажите точный путь к нужному узлу. |
/item[@type="очень длинное значение ..."]/name |
Значение внутри предиката атрибута слишком длинное. | Проверяйте значение через оператор и поле значения правила. |
Операторы для XML-условий
Оператор определяет, как правило будет сравнивать найденное XML-значение. Выберите оператор в зависимости от того, нужно ли полное совпадение, поиск фрагмента, проверка по регулярному выражению или проверка наличия узла.
Таблица 7. Операторы XML-условий
| Оператор | Когда использовать | Пример |
|---|---|---|
= |
Значение должно совпасть полностью. | XPath /order/status, значение blocked |
≠ |
Значение не должно совпадать. | XPath /order/status, значение paid |
| Содержит | Нужно найти фрагмент внутри значения. | XPath /comment/text, значение <script |
| Не содержит | Нужно проверить, что в значении нет указанного фрагмента. | XPath /order/source, значение test |
| Регулярное выражение | Нужно проверить значение по шаблону. | XPath /user/email, значение @example\\.com$ |
| Существует | Нужно проверить наличие узла или атрибута. | XPath /Envelope/Header/@token |
| Не существует | Нужно проверить отсутствие узла или атрибута. | XPath /debug |
Примечание: для операторов Существует и Не существует поле значения не заполняется.
Учет регистра
Переключатель Учитывать регистр влияет только на сравниваемое значение. Он не изменяет XPath и не влияет на имена XML-узлов.
Таблица 8. Как работает учет регистра в XML
| XPath | Значение в правиле | Значение в запросе | Если регистр учитывается |
|---|---|---|---|
/user/role |
Admin |
Admin |
Совпадет |
/user/role |
Admin |
admin |
Не совпадет |
/User/Role |
Admin |
Admin |
XPath останется /User/Role. Учет регистра значения не влияет на имя узла. |
Ограничения XML-условий
Перед сохранением правила проверьте ограничения XML-условий. Это особенно важно для сложных XML-документов и длинных XPath.
Таблица 9. Ограничения XML-условий
| Что ограничено | Ограничение |
|---|---|
| XPath | До 512 символов |
| Глубина XPath | До 32 сегментов |
| Предикаты в XPath | До 4 предикатов |
| Значение внутри предиката атрибута | До 128 символов |
Wildcard-сегменты * |
До 2 сегментов |
| Значение для сравнения | До 4096 символов |
| Регулярное выражение | До 1024 символов |
| Content-Type | XML-условие применяется только к XML-запросам из таблицы 2 |
Примечание: Для сложного XML лучше создать несколько точных правил, чем одно правило с широким XPath. Так правило проще проверить и сопровождать.
Примеры настройки
Пример 1. Запретить XML-запрос с пользователем admin
В этом примере правило блокирует XML-запрос, если в узле /Envelope/Body/Login/User указано значение admin.
Параметры правила:
- Название:
DENY XML admin user. - Действие: Запретить.
- Условия:
- Приложения = нужное приложение.
- Путь URL-адреса =
/api/xml/login. - HTTP-метод =
POST. - Область проверки = Содержание запроса.
- Тип тела = XML.
- XPath =
/Envelope/Body/Login/User. - Оператор =
=. - Значение =
admin.
- Включено: да.
Рисунок 10. Место для скриншота: создайте правило из примера 1. Покажите действие Запретить, XPath /Envelope/Body/Login/User, оператор = и значение admin.
Пример 2. Запретить XML-заказ по атрибуту
В этом примере правило блокирует XML-заказ, если в запросе есть товар с атрибутом type="digital" и именем License.
Параметры правила:
- Название:
DENY digital license order. - Действие: Запретить.
- Условия:
- Приложения = нужное приложение.
- Путь URL-адреса =
/api/orders/import. - HTTP-метод =
POST. - Область проверки = Содержание запроса.
- Тип тела = XML.
- XPath =
/order/items/item[@type="digital"]/name. - Оператор =
=. - Значение =
License.
- Включено: да.
Рисунок 11. Место для скриншота: создайте правило из примера 2. Покажите XPath с предикатом [@type="digital"], оператор = и значение License.
Пример 3. Проверить наличие XML-атрибута
В этом примере правило проверяет, есть ли в XML атрибут token. Для оператора Существует значение не указывается.
Параметры правила:
- Название:
DENY XML token header. - Действие: Запретить.
- Условия:
- Приложения = нужное приложение.
- Область проверки = Содержание запроса.
- Тип тела = XML.
- XPath =
/Envelope/Header/@token. - Оператор = Существует.
- Включено: да.
Рисунок 12. Место для скриншота: создайте правило из примера 3. Покажите XPath /Envelope/Header/@token, оператор Существует и пустое поле значения.
Пример 4. Отключить WAF ID для одного XML-сценария
Этот вариант подходит, если ложное срабатывание связано с конкретными WAF ID из события атаки. Правило отключит только указанные WAF ID и только для заданного XML-сценария.
Параметры правила:
- Название:
Исключение WAF ID для XML import. - Действие: Отключить правила по ID.
- ID правил для отключения:
150000123, 150000456. - Условия:
- Приложения = нужное приложение.
- Путь URL-адреса =
/api/orders/import. - HTTP-метод =
POST. - Область проверки = Содержание запроса.
- Тип тела = XML.
- XPath =
/order/source. - Оператор =
=. - Значение =
trusted-partner.
- Включено: да.
Рисунок 13. Место для скриншота: создайте правило из примера 4. Покажите действие Отключить правила по ID, поле ID через запятую и XML-условие с XPath /order/source.
Пример 5. Разрешить легитимный XML-запрос
Используйте разрешающее правило только для ложных срабатываний. Добавляйте точные условия, чтобы правило не разрешало лишние запросы.
Параметры правила:
- Название:
ALLOW trusted XML import. - Действие: Разрешить.
- Условия:
- Приложения = нужное приложение.
- Путь URL-адреса =
/api/orders/import. - HTTP-метод =
POST. - IP-адрес источника → В группе IP-адресов = группа доверенного сервиса.
- Область проверки = Содержание запроса.
- Тип тела = XML.
- XPath =
/order/source. - Оператор =
=. - Значение =
trusted-partner.
- Включено: да.
Рисунок 14. Место для скриншота: создайте правило из примера 5. Покажите действие Разрешить, группу IP-адресов и XML-условие с XPath /order/source.
Как проверить правило после создания
После сохранения проверьте правило по чек-листу из таблицы 10.
Таблица 10. Чек-лист проверки XML-правила
| Что проверить | Ожидаемый результат |
|---|---|
| Приложение | Выбрано только нужное приложение |
| URL | Указан точный путь, если правило не должно быть глобальным |
| Метод | Указан нужный метод, обычно POST |
| Content-Type запроса | Соответствует XML-типу из таблицы 2 |
| XPath | Начинается с / и не использует некорректные конструкции из таблицы 6 |
| Оператор | Соответствует цели проверки |
| Значение | Заполнено только для операторов, которым требуется значение |
| Учет регистра | Настроен осознанно и применяется только к сравниваемому значению |
| Режим приложения | Для блокировки используется режим Активная защита, а не Мониторинг |
Рисунок 15. Место для скриншота: покажите сохраненное XML-правило в таблице правил. В кадре должны быть видны действие, состояние правила и краткое описание условий.
Частые ошибки
- Слишком широкий XPath. Например,
//Userили путь с большим количеством*. Такое правило может сработать на запросы, для которых оно не предназначено. Используйте точный абсолютный путь. - Широкое разрешающее правило. Если известны WAF ID из события атаки, чаще безопаснее выбрать Отключить правила по ID и добавить точные условия.
- Ожидание блокировки в режиме мониторинга. В режиме Мониторинг правило только фиксирует срабатывание. Для блокировки нужен режим Активная защита.
- Неверный Content-Type. Если запрос пришел не как XML, XML-условие не подойдет. Проверьте
Content-Typeпо таблице 2. - Значение указано для оператора «Существует». Для операторов Существует и Не существует поле значения должно быть пустым.
- Смешение регистра значения и XPath. Переключатель Учитывать регистр влияет на сравниваемое значение, но не меняет имя XML-узла в XPath.
- Слишком сложный XPath. Не используйте функции, оси и глубокие пути с wildcard. Укажите точный путь и выберите подходящий оператор.