Доступність та зловживання
Застосунок, який тривіально зрушити з місця або який дозволяє одному викликачу роздувати твій рахунок, має проблему безпеки, навіть якщо дані не витікають. Цей розділ про обмеження того, скільки один клієнт може спожити.
Чек-лист
- Обмежуй частоту запитів для кожної кінцевої точки, а не лише для входу. Обмежуй, як часто і скільки викликів кожен клієнт (за IP, обліковим записом або ключем) може зробити. Необмежене споживання ресурсів - окремий ризик API за OWASP. Повертай 429, коли ліміт перевищено.
- Суворіше обмежуй дорогі операції. Усе, що запускає виклик моделі, листа, конвертацію файлу, звіт або сканування бази даних, потребує жорсткішого ліміту, бо кожен виклик коштує реальних грошей або процесорного часу.
- Обмежуй пагінацію. Кінцева точка списку має обмежувати кількість записів на
сторінку.
?limit=1000000має бути зведено до розумного максимуму, а не виконано. - Обмежуй розмір завантажень і тіл запитів до розбору, а також кількість одночасних завантажень або завдань, які користувач може запустити.
- Став тайм-аути та обмеження паралельності для вихідних викликів і обробки запитів, щоб один повільний сервіс не міг вичерпати твої робочі процеси.
- Постав CDN або WAF перед застосунком для захисту від DDoS. Сервіс на кшталт Cloudflare поглинає масивні атаки і дозволяє обмежувати частоту та фільтрувати за географією на краю мережі, до того як трафік дійде до твого origin. Переконайся, що до origin не можна достукатися напряму, в обхід краю (див. інфраструктуру).
- Відмовляй швидко і безпечно. Коли ліміт досягнуто або залежність недоступна, відхиляй запит одразу з чітким статусом, а не ставиш роботу в чергу, яка накопичується.
- Стеж за вартістю автомасштабування. Атаки на вичерпання ресурсів часто спершу проявляються в рахунку за хмару, а не у відмові сервісу. Налаштуй сповіщення про незвичайні витрати та обсяг запитів.
Як тестувати
- Надішли серію запитів на кожну кінцеву точку і переконайся, що отримуєш 429.
- Запитай величезний розмір сторінки та величезне завантаження і переконайся, що обидва обмежуються.
- Переконайся, що IP-адреса твого origin не відповідає на трафік застосунку напряму, а лише через край.