Защита от SSRF в загрузке по URL
Вопрос
Сервис скачивает картинку по URL, который присылает пользователь. Какая защита от SSRF корректна?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Только http/https, резолвить хост, запретить внутренние IP и подключаться к проверенномуправильный ответ
- Проверить, что строка URL не содержит
localhost,127.0.0.1и169.254.169.254 - Проверить hostname по регулярке белого списка и скачать по исходному URL, следуя редиректам
- Достаточно таймаута на скачивание и лимита размера ответа
Разбор
SSRF позволяет заставить сервер сходить во внутреннюю сеть: метаданные облака (169.254.169.254), админки, Redis без пароля. Фильтр по строке обходится десятком способов: 0.0.0.0, [::1], десятичная запись IP, домен, который резолвится в 127.0.0.1, редирект на внутренний адрес. Ещё одна атака, DNS rebinding: при проверке домен резолвится во внешний IP, а при подключении уже во внутренний. Поэтому проверяют результат резолвинга и подключаются к тому же IP (в Node через свой lookup в агенте), повторяя проверку на каждом редиректе. Дополнительно сетевая изоляция: отдельный egress-прокси без доступа во внутреннюю сеть.
Таймаут защищает от зависания, но не от доступа к внутренним ресурсам.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API