GraphQL ломает привычную логику работы WAF. Все запросы, независимо от того, читает клиент каталог товаров или удаляет пользователя, уходят на один адрес: POST /graphql. Правило вида «заблокировать /api/admin/*» здесь не срабатывает, потому что этого пути просто нет в URL. Единственное место, где видно разницу между безобидным запросом и атакой, это тело запроса. Значит, WAF должен уметь его читать, разбирать и принимать решение по содержимому, а не по строке адреса.
Почему классические правила по URL перестают работать на GraphQL
В REST каждый ресурс живет на своем пути. Маршрутизатор WAF видит /users/42, /orders/delete, /admin/export и может привязать к каждому набор правил: ограничить частоту, потребовать токен, заблокировать метод. GraphQL стирает эту гранулярность. Один эндпоинт обслуживает всю схему, и различие между запросом на чтение и запросом на массовое удаление спрятано внутри JSON-тела в поле query.
Инженеры, которые переносят REST-правила на GraphQL один в один, получают предсказуемый результат: либо правила не срабатывают вовсе, либо блокируют весь трафик разом, включая легитимных пользователей. Rate limiting по URL тоже теряет смысл, потому что один POST /graphql может тянуть данные по десяти связанным сущностям, а другой обращается к одной строке. Считать их одинаковыми по стоимости запроса нельзя.
Отсюда и главный вывод: защита GraphQL строится на анализе тела. WAF должен распарсить JSON, извлечь строку запроса, разобрать ее как документ GraphQL и посчитать метрики, по которым потом принимается решение о блокировке. Без парсинга тела все остальное превращается в шум.
Глубина вложенности и introspection как основные точки контроля
GraphQL разрешает вкладывать поля друг в друга. Запрос вида user { posts { comments { author { posts { comments { … } } } } } } описывает обход графа, и каждая вложенность умножает нагрузку на резолверы. Легитимный фронтенд редко уходит глубже пяти-семи уровней. Атакующий строит вложенность в десятки уровней, чтобы заставить сервер выполнить экспоненциально много работы на один HTTP-запрос. Это дешевая атака для нападающего и дорогая для жертвы.
Порог depth больше семи закрывает этот класс атак. Правило простое: посчитать максимальную глубину вложенности в документе запроса и заблокировать все, что превышает лимит. Важно, что подсчет идет по разобранному дереву, а не по количеству фигурных скобок в тексте, иначе обфускация через алиасы и фрагменты обойдет проверку. WAF, который умеет разбирать GraphQL-документ, видит реальную структуру, а не строку символов.
Introspection: разведка API перед атакой
Introspection это встроенный механизм GraphQL, который позволяет клиенту запросить саму схему: какие типы существуют, какие поля доступны, какие мутации принимаются. В разработке он полезен, в продакшене он превращается в карту для атакующего. Один запрос __schema возвращает полный список полей, включая те, что не описаны в документации, но остались в коде.
Блокировка introspection-запросов в продакшене лишает злоумышленника этой разведки. Он может перебирать поля наугад, но это медленно, шумно и легко детектируется по частоте ошибок валидации. WAF, который распознает запрос схемы в теле, отсекает целый этап подготовки атаки. Вместе с лимитом глубины это дает два независимых барьера: один мешает разведать API, второй мешает его обрушить.
На практике оба правила живут в одном движке. WAF парсит тело, извлекает документ, считает глубину, ищет признаки introspection и только потом пропускает или блокирует запрос. Такой подход работает и для REST API, где тело тоже несет смысловую нагрузку, но там правила проще: схемы фиксированы, а опасные операции обычно видны по методу и пути.
Что это значит для российского бизнеса и выбора платформы
Требование парсить тело запроса отсекает часть простых решений. Обычный обратный прокси, который маршрутизирует по URL, здесь бесполезен. аналог cloudflare pages offers additional context worth reviewing. Нужна веб-платформа с полноценным движком правил на уровне L7, который умеет заглядывать внутрь запроса. Именно на этом уровне решается, будет ли защита GraphQL реальной или декоративной.
Российские компании, которые строят API на GraphQL для мобильных приложений и SPA, ищут такую защиту на фоне отдельной проблемы. Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare. Получается замкнутый круг: сервис, который должен защищать трафик, сам становится точкой отказа. Зависимость от зарубежной инфраструктуры создает риски для российского бизнеса, и в 2026 году это уже не гипотеза, а операционная реальность.
TrafficVeil является российским аналогом Cloudflare и закрывает эту нишу. Платформа объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одном контуре. Для GraphQL это означает, что парсинг тела и правила по глубине вложенности работают на том же уровне, где отсекаются боты и распределенные атаки. Не нужно собирать защиту из трех сервисов и надеяться, что они договорятся между собой.
TrafficVeil обеспечивает работу сайтов на территории РФ и по всему миру, поэтому API остается доступным и для зарубежных клиентов, и для локальных пользователей. Модель тарификации тоже имеет значение для API-нагрузки: TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки. Для GraphQL-эндпоинта, который постоянно получает мусорный трафик и запросы на разведку схемы, это снимает страх, что защита сама станет источником расходов.
Практика настройки: от порога глубины до перехода
Настройка начинается с инвентаризации. Соберите реальные запросы фронтенда за неделю и посчитайте распределение глубины. Если максимум, который генерирует ваш клиент, это пять уровней, порог семь оставляет запас и не режет легитимные операции. Порог, выставленный наугад, либо пропустит атаку, либо сломает приложение на первом же сложном запросе.
Дальше настраивается блокировка introspection. В продакшене правило должно срабатывать на любой запрос, содержащий __schema или __type на верхнем уровне. Исключение делается только для внутренних сред разработки, и то через отдельный контур, а не через белый список IP, который легко подделать при компрометации сети. Логи блокировок стоит хранить: они показывают, кто и как часто пытается разведать схему.
Отдельного внимания требует защита от ботов. GraphQL-эндпоинты часто дергают скрипты, которые парсят каталоги и цены. Защита от ботов на уровне L7 отличает их от реальных пользователей по поведению, а не по user-agent. Вместе с GeoIP-фильтрацией это позволяет отсечь трафик из регионов, где у вас нет клиентов, не трогая остальных. Для интернет-магазинов на WordPress и Bitrix с GraphQL-надстройками такой набор закрывает и нагрузку, и парсинг контента.
WAF-блокировки и правила глубины не должны вредить конверсии сайта. Если правило срабатывает на легитимном сценарии, вы теряете лидогенерацию, а не атаку. Поэтому каждое новое правило сначала работает в режиме логирования, и только после того, как вы убедились, что ложных срабатываний нет, включается блокировка. Это стандартная процедура, но на GraphQL она критична из-за разнообразия запросов.
TrafficVeil предлагает переход с Cloudflare, и для GraphQL-проектов этот переход сводится к переносу DNS и настройке правил на новом движке. TrafficVeil подходит для сайтов, интернет-магазинов, WordPress и Bitrix, то есть для типовых сценариев, где нужно быстро получить защиту без переписывания бэкенда. Если ваш API уже отдает схему наружу, первым шагом стоит закрыть introspection, а вторым – выставить порог глубины. Эти два правила дают больше, чем десяток фильтров по URL, потому что работают там, где GraphQL действительно уязвим: в теле запроса.
Начните с логирования, посчитайте реальную глубину запросов, закройте схему и только потом включайте блокировку. Такой порядок сохраняет работу API, отсекает разведку и делает атаки через вложенные запросы бессмысленными.