XML-условие предназначено для проверки конкретного значения внутри XML-тела запроса: узла, атрибута, элемента списка или значения по XPath.

Описание XML-условия

Тип тела и Content-Type

Для данных внутри XML-документа используется «Содержание запроса» → «XML». Обычный текст, формы и multipart-запросы проверяются другими типами условий.

Сценарий

Тип условия

Проверка значения внутри XML-документа

«Содержание запроса» → «XML»

Проверка обычного текста без XML-структуры

«Содержание запроса» → «Тело запроса»

Проверка формы application/x-www-form-urlencoded

«Содержание запроса» → «Поле формы»

Проверка файла или части multipart-запроса

«Содержание запроса» → «Multipart»

XML-условие применяется только к запросам с XML Content-Type.

Заголовок 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-условие доступно при создании и редактировании правила WAF. В области проверки «Содержание запроса» ему соответствует тип тела «XML». После выбора этого типа доступны поля «XPath», «Оператор» и поле значения.

Для XML-условий предусмотрены те же действия правила, что и для других условий.

Действие

Назначение

«Запретить»

Блокировка XML-запроса по значению узла или атрибута.

«Разрешить»

Устранение ложного срабатывания для легитимного XML-запроса.

«Отключить правила по ID»

Отключение конкретных WAF ID, ошибочно сработавших на XML-запрос и указанных в событии атаки.

Примечание: если XML-запрос одновременно подходит под правила «Разрешить» и «Запретить», приоритет имеет «Разрешить». Поэтому разрешающие правила должны быть максимально точными.

Внимание: в режиме приложения «Мониторинг» правило фиксирует срабатывания, но не блокирует запросы. Для блокировки нужен режим «Активная защита».

XPath

XPath задаёт расположение проверяемого значения в XML-документе. Путь должен быть абсолютным и начинаться с /.

Что проверяется

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-документа к нужному узлу или атрибуту.

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 труднее контролировать: они могут охватить запросы, для которых правило не предназначено.

Не используйте

Причина

Замена

//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

Отсутствует начальный символ /.

/order/customer/id

/Envelope/Body/*/*/*/*/User

Слишком много wildcard-сегментов *.

Точный путь к нужному узлу.

/item[@type="очень длинное значение ..."]/name

Слишком длинное значение внутри предиката атрибута.

Проверка значения через оператор и поле значения правила.

Операторы XML-условий

Оператор определяет способ сравнения найденного 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-узлов.

XPath

Значение в правиле

Значение в запросе

Если регистр учитывается

/user/role

Admin

Admin

Совпадет.

/user/role

Admin

admin

Не совпадет.

/User/Role

Admin

Admin

XPath останется /User/Role. Учет регистра значения не влияет на имя узла.

Ограничения XML-условий

Параметр

Ограничение

XPath

До 512 символов

Глубина XPath

До 32 сегментов

Предикаты в XPath

До 4 предикатов

Значение внутри предиката атрибута

До 128 символов

Wildcard-сегменты *

До 2 сегментов

Значение для сравнения

До 4096 символов

Регулярное выражение

До 1024 символов

Content-Type

Только XML-запросы с типами, перечисленными в разделе «Тип тела и Content-Type».

Примечание: для сложного XML предпочтительны несколько точных правил вместо одного правила с широким XPath: их проще проверить и сопровождать.

Порядок работы

Добавление XML-условия

Шаг

Действие

Скриншот

1

Возьмите пример реального XML-запроса. Проверьте заголовок Content-Type и определите путь от корневого элемента к нужному узлу или атрибуту.

Форма «Добавление правила»: XML-условие с XPath /order/customer/id, оператором = и значением 100500

2

При создании или редактировании правила WAF в блоке условий выберите «Область проверки» далее «Содержание запроса». В поле «Тип тела» выберите «XML».

Форма «Добавление правила»: XML-условие с XPath /order/customer/id, оператором = и значением 100500

3

Укажите «XPath», выберите «Оператор» и заполните значение для сравнения, если оператор его требует.

Пример HTTP-запроса POST /api/orders с Content-Type application/xml и XML-телом заказа

Примечание: перед сохранением проверьте ограничения XML-условия, особенно при работе со сложным XML-документом или длинным XPath.