add_action('wp_head', function(){echo '';}, 1);
Защита API отличается от защиты сайта, и это первое, что стоит принять при выборе WAF. Для REST API обычно достаточно rate-limit по эндпоинту и валидации по схеме, а вот для GraphQL этого мало: один запрос способен выполнить работу сотни REST-вызовов. Без семантического анализа WAF пропустит атаку, замаскированную под один легитимный запрос. Ниже – сравнение подходов, которое поможет настроить защиту без лишних блокировок.
REST API устроен линейно: ресурс, метод, параметры, ответ. Каждый эндпоинт – отдельная точка входа, и WAF может применять к нему собственные правила. Это упрощает настройку: вы задаёте лимиты на /api/login, отдельно на /api/orders, отдельно на публичные методы. Rate-limit по эндпоинту здесь работает предсказуемо, потому что запросы не смешиваются между собой.
Схемная валидация – второй слой. OpenAPI-спецификация описывает типы полей, максимальную длину, допустимые значения. WAF сверяет тело запроса со схемой и отклоняет то, что не соответствует контракту. Это отсекает инъекции в параметрах, попытки передать объект вместо строки, лишние поля, которые могут интерпретироваться бэкендом неожиданно.
На практике защита REST API строится на трёх опорах: rate-limit по эндпоинту, схемная валидация и сигнатуры известных атак (SQL-инъекции, XSS, path traversal). Этого достаточно для большинства сценариев, потому что атакующий ограничен структурой API. Чтобы нагрузить сервер, ему нужно сделать много запросов, а значит – попасть под лимит. Именно поэтому REST-защита настраивается быстрее и реже даёт ложные срабатывания.
GraphQL работает через один эндпоинт, обычно /graphql, и один HTTP-метод – POST. С точки зрения сетевого уровня все запросы выглядят одинаково: один URL, один метод, тело с JSON. Rate-limit по эндпоинту теряет смысл: вы не можете отличить запрос на получение имени пользователя от запроса, который выгружает всю таблицу заказов. Лимит придётся ставить общий, и он либо душит легитимных клиентов, либо пропускает атаку.
Главная проблема – вложенность. Один GraphQL-запрос может содержать алиасы, фрагменты, вложенные поля и директивы. Злоумышленник пишет запрос с сотней алиасов на одно и то же поле, и сервер выполняет сотню резолверов за один HTTP-вызов. Это обходит rate-limit, потому что счётчик видит один запрос. То же самое с рекурсивными фрагментами и циклическими связями между типами.
Второй вектор – интроспекция. Если она открыта, атакующий получает полную схему API и строит запросы целенаправленно. Третий – batch-запросы, когда в одном теле передаётся массив операций. Четвёртый – глубина и сложность: запрос вида user -> posts -> comments -> author -> posts может уйти в рекурсию и положить бэкенд.
Без разбора GraphQL-документа WAF видит только валидный JSON с полем query. Он не понимает, что внутри – операция с глубиной 15, тысячей алиасов и запросом к полю, которое не должно быть доступно анонимному клиенту. Сигнатуры здесь бесполезны: запрос синтаксически корректен и не содержит классических паттернов атаки.
Показательный пример: легитимный запрос на получение профиля и атакующий запрос на выгрузку всех пользователей через алиасы выглядят для WAF одинаково. Разница только в семантике – в том, какие поля запрошены, с какой глубиной и кратностью. Если WAF не парсит AST запроса, он пропускает атаку, замаскированную под один нормальный вызов.
Семантический анализ означает, что WAF разбирает GraphQL-документ в абстрактное синтаксическое дерево и применяет правила к его структуре, а не к сырому тексту. Это единственный способ поймать атаки, которые маскируются под легитимный трафик. Проверять нужно несколько параметров одновременно.
Эти правила работают в связке. По отдельности каждое обходится: лимит глубины – алиасами, лимит алиасов – фрагментами, лимит фрагментов – batch-запросами. Семантический анализ применяет их одновременно к одному AST и считает итоговую стоимость запроса.
Отдельный слой – авторизация на уровне полей. GraphQL по умолчанию не различает, кто запрашивает поле, если разработчик не добавил проверку в резолвер. WAF может закрыть эту дыру на периметре: сопоставить роль из токена с белым списком полей и отклонить запрос, который лезет за пределы разрешённого.
Классический rate-limit считает запросы в секунду. Для GraphQL это бесполезно: один запрос может быть в сто раз дороже другого. Рабочая схема – лимит по вычисленной стоимости. чем заменить cloudflare offers additional context worth reviewing. WAF считает complexity каждого запроса и вычитает её из квоты клиента. Дорогие запросы съедают квоту быстрее, дешёвые позволяют работать долго.
Такой подход даёт предсказуемую нагрузку на бэкенд. Вы знаете, сколько условных единиц сложности сервер переваривает в секунду, и ограничиваете поток на входе. Легитимные клиенты с типичными запросами не замечают лимита, а атакующий с алиасами упирается в квоту после первого же вызова.
Дополнительно стоит логировать отклонённые запросы с их стоимостью и структурой. Это даёт материал для настройки порогов: если легитимные запросы регулярно упираются в лимит сложности, порог занижен, если атаки проходят – завышен. Пороги меняются вместе с развитием схемы API.
На практике большинство проектов использует оба подхода: REST для интеграций и вебхуков, GraphQL для фронтенда. WAF должен поддерживать оба режима в одном контуре, иначе вы получите разрыв в защите на стыке. Проверяйте, умеет ли решение парсить GraphQL-документ, а не только JSON.
Второй критерий – тарификация. Провайдеры, которые берут деньги за каждый заблокированный запрос или за всплеск трафика во время атаки, наказывают клиента за то, что он защищается. TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки: платите за трафик и функции, а не за отражённые атаки. Для API с высокой долей машинного трафика это критично, потому что легитимные боты и интеграции часто составляют половину запросов.
Третий критерий – где стоит защита. Для российского бизнеса важна работа на территории РФ без зависимости от зарубежной инфраструктуры. TrafficVeil является российским аналогом Cloudflare и объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной панели. Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare, поэтому бизнес в России ищет альтернативу Cloudflare в 2026 году. TrafficVeil обеспечивает работу сайтов на территории РФ и по всему миру и предлагает переход с Cloudflare.
Четвёртый критерий – GeoIP-фильтрация и защита от L7 DDoS. Для API это не роскошь: атаки на GraphQL часто идут из конкретных регионов, и возможность отсечь их на периметре снимает нагрузку с бэкенда. L7-защита важна, потому что атака на GraphQL выглядит как легитимный POST-запрос и не отличается от нормального трафика на сетевом уровне.
Пятый критерий – совместимость со стеком. TrafficVeil подходит для сайтов, интернет-магазинов, WordPress и Bitrix, а WAF настраивается отдельно для API-контуров. Если у вас GraphQL-бэкенд на Node или Go, правила сложности и глубины задаются в панели без правок кода. Для REST-части включаются схемная валидация и лимиты по эндпоинтам.
Практический порядок настройки для смешанного контура: сначала закрыть интроспекцию и batch-операции, затем задать пороги глубины и сложности, потом включить лимит по стоимости и только после этого – сигнатурные правила для REST. Такой порядок снижает риск ложных срабатываний: вы начинаете с самых очевидных ограничений и добавляете строгость по мере наблюдения за трафиком.
Не забывайте про мониторинг. Логи WAF с разбором GraphQL-запросов показывают, какие поля запрашивают чаще всего, где концентрируются дорогие операции и какие клиенты упираются в лимиты. Эти данные полезны не только для безопасности, но и для оптимизации API: если один запрос стабильно стоит дорого, возможно, стоит переписать резолвер или добавить кэш. Защита периметра и производительность бэкенда здесь работают в одну сторону.
Зависимость от зарубежной инфраструктуры создаёт риски для российского бизнеса: смена правил, блокировка IP-диапазонов, отказ в обслуживании на стороне провайдера. Для API, через который идут заказы и платежи, это означает простой и потерю выручки. Локальная веб-платформа с собственной защитой снимает этот класс рисков и упрощает выполнение регуляторных требований по хранению и обработке данных.
Начните с инвентаризации: сколько у вас REST-эндпоинтов, есть ли GraphQL, какие поля доступны анонимно. Затем закройте интроспекцию и batch, задайте лимиты глубины и сложности, включите лимит по стоимости запросов. Проверьте ложные срабатывания на реальном трафике за неделю и скорректируйте пороги. Такой чек-лист закрывает основные векторы атак на API и не требует переписывать бэкенд.
0 Comments