Стили API и их риски: REST, GraphQL, gRPC
API, мобильные приложения и современные интерфейсыКак устроены разные API и какие классы проблем им свойственны.
Зачем это нужно
- API — основная поверхность атаки современных приложений и главный потребитель данных.
- У каждого стиля свои типовые ошибки: знать их — значит проверять быстрее и точнее.
- Защита API строится иначе, чем защита веб-страниц.
Теория
REST-API оперирует ресурсами и методами HTTP; типичные риски: неполный контроль доступа к объектам, отсутствие ограничений по объёму запроса, массовое присвоение полей (клиент передаёт поля, которые не должен менять), избыточная выдача данных, отсутствие проверки владельца ресурса, слабое управление версиями. Отдельный класс — недостаточная защита служебных и административных точек.
GraphQL даёт гибкие запросы и меняет профиль проблем: сложные вложенные запросы вызывают чрезмерную нагрузку, отсутствие ограничений глубины и сложности, интроспекция раскрывает схему, контроль доступа должен проверяться на уровне полей, а не только точек входа. Защита: отключение интроспекции в продакшене, ограничение глубины и стоимости запросов, явные разрешения на уровне типов и полей, ограничение пакетных запросов.
gRPC использует схему и бинарный протокол поверх HTTP/2; риски связаны с раскрытием схемы, отсутствием аутентификации на уровне методов, доверием к метаданным и слабым контролем доступа. Защита: взаимная аутентификация, проверка метаданных и прав на каждый метод, ограничение отражения и служебных интерфейсов, инвентаризация схем. Общие принципы для всех стилей: аутентификация сервисов, авторизация на уровне объекта и поля, ограничение объёма, журналирование, версионирование и управление жизненным циклом.
Ключевые концепции
- Массовое присвоение полей
- Клиент передаёт поля, которые сервер не должен принимать: приводит к повышению прав или изменению чужих данных.
- Контроль доступа на уровне объекта
- Проверка прав на каждый конкретный объект, а не только на точку входа.
- Стоимость запроса GraphQL
- Метрика сложности запроса: позволяет ограничивать ресурсоёмкие обращения.
- Интроспекция
- Возможность получить схему GraphQL; в продакшене обычно ограничивается.
- Взаимная аутентификация сервисов
- Проверка подлинности обеих сторон при взаимодействии сервисов.
- Инвентаризация API
- Полный перечень версий и точек: без него невозможно управлять риском.
Инструменты
- Документация OpenAPI и Postman для описания и проверки API в своей среде.
- Burp Suite и ZAP — ручная работа с API-запросами.
- Инструменты проверки GraphQL schema и тестирования запросов.
- Платформы управления API-шлюзом и политиками доступа.
- Статические анализаторы контрактов и генераторы тестов.
Практика в легальных лабораториях
- Опишите в OpenAPI три точки учебного API и проверьте соответствие реализации описанию.
- Смоделируйте в лаборатории массовое присвоение полей и предложите защиту.
- Настройте ограничение глубины запроса в GraphQL и проверьте, что сложный запрос отклоняется.
- Проверьте в своей лаборатории, доступны ли служебные точки без аутентификации.
- Составьте чек-лист проверки API из двадцати пунктов.
Защита, детект и защитные меры
- Авторизуйте на уровне объекта: проверяйте права на каждый ресурс.
- Ограничивайте объём и сложность запросов, вводите лимиты по умолчанию.
- Используйте явные списки разрешённых полей при массовых операциях.
- Ведите инвентарь API и версионирование; отключайте устаревшие версии.
Правовая рамка и этика
- Проверка API выполняется только против своих сервисов или по письменному разрешению.
- Не эксплуатируйте найденные дефекты за пределами минимальной демонстрации.
Типичные ошибки
- Считать, что токен в заголовке автоматически решает вопрос авторизации.
- Забывать про служебные и внутренние точки API.
- Оставлять интроспекцию и отладку включёнными в продакшене.
Чек-лист «умею»
- Различаю риски REST, GraphQL и gRPC.
- Понимаю принцип авторизации на уровне объекта.
- Умею ограничивать стоимость запросов.
- Проверяю служебные точки в лаборатории.
- Версионирую API и управляю жизненным циклом.
Вопросы на интервью
- Какие риски специфичны для GraphQL?
- Как вы проверяете, что API корректно проверяет права на объекты?
- Как защитить служебные точки API?