Настройка защиты
WAF
Как WAF проверяет запросы, какие лимиты действуют и как разрешить большие загрузки
Что проверяет WAF
WAF - это фильтр запросов к сайту. Он проверяет адрес страницы, параметры после знака ?, cookie, название браузера или программы, адрес предыдущей страницы и тело запроса.
В теле WAF ищет признаки атак в полях формы, JSON, webhook и других данных. Проверяется не больше 1 МиБ на один запрос.
Выберите нужные проверки WAF. Если GUJ найдёт признак, который вы включили, запрос не дойдёт до сервера сайта.
Как это работает
GUJ проверяет адрес страницы и параметры после ?.
Также GUJ проверяет cookie, название браузера или программы и адрес предыдущей страницы. В HTTP-запросе эти данные называются Cookie, User-Agent и Referer.
Если выбрано правило, которое проверяет тело, GUJ сначала принимает его в пределах 1 МиБ, проверяет и только затем передаёт сайту. Правила только для URL не читают тело и не добавляют эту работу.
1 МиБ - это 1 048 576 байт вместе с JSON, полями формы, multipart-разметкой и содержимым файла. Это не отдельный лимит только для файла.
JSON, Base64 и формы с файлами
В JSON GUJ учитывает Unicode-escape: например, \u003cscript\u003e проверяется как обычный текст <script>.
Если приложение декодирует конкретные JSON-поля из Base64, укажите их в блоке Base64-поля JSON на странице WAF: по одному пути в строке, например payload.content или items.0.data. Число означает индекс массива с нуля. Можно указать до 20 путей; поддерживаются Base64 и Base64URL.
Указанное поле необязательно в каждом запросе. Если оно присутствует, значение должно быть строкой с корректным Base64. Некорректное значение получает ответ 400, а суммарный результат декодирования больше 512 КиБ - ответ 413. Не добавляйте сюда поля с бинарными файлами.
В multipart/form-data WAF проверяет текстовые поля, имена полей и имена файлов. Содержимое файлов не сравнивается с текстовыми сигнатурами: это предотвращает ложные блокировки и не превращает WAF в антивирус. Тип, размер и содержимое файла должно проверять приложение.
Что выбрать
| Пункт | Что проверяется |
|---|---|
| Опасные запросы к базе | Известные SQL-фрагменты в адресе, заголовках и теле запроса. |
| Вредный код в ссылках | Известные признаки JavaScript-кода в адресе, заголовках и теле запроса. |
| Попытки открыть файлы сервера | Пути к известным системным и служебным файлам в проверяемых данных запроса. |
| Попытки выполнить команды | Известные фрагменты команд в адресе, заголовках и теле запроса. |
| Выход за пределы папок | Конструкции вида ../ в пути и параметрах URL. |
| Сессии в ссылках | Известные названия параметров сессии после знака ? и в теле запроса. |
| Поиск служебных файлов | Обращения к известным файлам настроек и резервным копиям по их адресу. |
| Обращения к внутренним адресам | Известные локальные и служебные адреса в параметрах URL и теле запроса. |
Опасные запросы к базе
Этот пункт ищет известные SQL-фрагменты в адресе, параметрах URL, выбранных заголовках и теле запроса размером до 1 МиБ.
Сайт всё равно должен использовать параметры запросов к базе и проверять входные данные.
Вредный код в ссылках
Этот пункт ищет известные признаки JavaScript-кода в адресе, параметрах URL, выбранных заголовках и теле запроса размером до 1 МиБ.
Текст, который посетитель отправляет в теле запроса, должен проверять и безопасно выводить сам сайт.
Попытки открыть файлы сервера
Этот пункт ищет в запросе известные пути к системным и служебным файлам.
WAF проверяет текстовые поля, но не разбирает содержимое загружаемых файлов и архивов и не заменяет антивирусную проверку.
Попытки выполнить команды
Этот пункт ищет известные фрагменты команд в адресе, параметрах URL, выбранных заголовках и теле запроса размером до 1 МиБ.
WAF не заменяет проверку входных данных и безопасный запуск процессов в коде сайта.
Выход за пределы папок
Этот пункт ищет конструкции вида ../ в пути страницы и параметрах URL.
Если сайт специально использует такие адреса, проверьте его после включения.
Сессии в ссылках
Этот пункт ищет известные названия параметров сессии в части адреса после знака ? и в теле запроса.
Если старый сайт передаёт сессию в адресе специально, сначала проверьте его работу с этим пунктом.
Поиск служебных файлов
Этот пункт сравнивает путь страницы с известными адресами файлов настроек, резервных копий и служебных каталогов.
Даже при включённой проверке такие файлы нельзя хранить в открытой папке сайта.
Обращения к внутренним адресам
Этот пункт ищет известные локальные и служебные адреса в параметрах URL и теле запроса.
Приложение всё равно должно само проверять адрес целиком и ограничивать, к каким сетям и сервисам оно может обращаться.
Лимиты тела запроса
| Режим | Что произойдёт |
|---|---|
| Выбраны правила проверки тела | Тело до 1 МиБ проверяется. При превышении Nginx возвращает 413 Payload Too Large до Lua-проверки и не передаёт запрос сайту. |
| Выбраны только правила URL | WAF не читает тело. Общий лимит тела составляет 128 МиБ. |
| WAF выключен | Проверки WAF нет. Общий лимит тела запроса составляет 128 МиБ. |
| Для пути выбрано «Не проверять тело WAF» | WAF продолжает проверять URL и заголовки, но не читает тело. Запрос потоково передаётся сайту с общим лимитом 128 МиБ. Остальные слои GUJ остаются включены. |
В лимит 128 МиБ также входит всё тело запроса. Для multipart/form-data файл должен быть меньше лимита, потому что к нему добавляются границы и поля формы.
Лимит применяется в Nginx и к запросам с Content-Length, и к chunked-загрузкам. Для chunked-запроса 413 возвращается, как только объём превысил 1 МиБ: ждать конец большой загрузки не нужно.
Если включена проверка тела, сжатые запросы с Content-Encoding, отличным от identity, получают 415. Проверять сжатые байты бесполезно, а незаметно пропускать их было бы обходом WAF. Если API обязательно принимает сжатое тело, настройте для его узкого пути исключение проверки тела.
Как разрешить большие файлы и запросы
Не выключайте всю защиту домена или весь WAF. Добавьте узкое исключение только для тела и только для адреса, который действительно принимает большой запрос.
- Откройте Домен → Ограничения доступа
- Найдите блок Исключения для отдельных проверок
- Укажите путь загрузки, например
/api/files/upload - Выберите Точное совпадение. Если исключение нужно для раздела, укажите узкий префикс, например
/api/files/, и выберите Начинается с - В поле проверок выберите Не проверять тело WAF (для загрузок)
- Оставьте исключение активным, сохраните настройки и проверьте обычный запрос, допустимый файл и превышение лимита
Для большого тела достаточно режима «Не проверять тело WAF»: WAF всё ещё проверит URL и заголовки, а Antibot, Anti-DDoS, ограничения доступа и правила продолжат работать.
Подробно о точном совпадении и префиксе написано в инструкции по исключениям.
Что проверить на сервере сайта
На пути без проверки тела его безопасность обеспечивает приложение. Оно должно проверять авторизацию и CSRF-защиту, размер, реальный формат и содержимое файла, ограничивать частоту и квоту пользователя, а загрузки хранить вне исполняемой папки.
Для файлов больше 128 МиБ используйте прямую загрузку в объектное хранилище по короткоживущей подписанной ссылке или загрузку частями. Простое отключение WAF не снимает общий лимит ноды.
Что WAF не заменяет
WAF ищет ограниченный набор известных признаков. Он не гарантирует блокировку всех вариантов атак и не исправляет уязвимости сайта.
GUJ нормализует URL-кодирование и Unicode-escape в JSON. Base64 он декодирует только в явно указанных JSON-полях: назначение неизвестных полей и собственных форматов должен знать и проверять сам сайт.
Обновляйте сайт, проверяйте данные на сервере приложения и ограничивайте права доступа к файлам и базе.
Помогла ли эта статья?
Ваш ответ поможет сделать документацию понятнее