Внутренний или внешний
Задание 1Введение
Цель: Строго валидировать входные данные и защищаться от SSRF.
Напишите функцию is_private_ip(s) для защиты от SSRF. Верните True, только если s — корректный IPv4-адрес из диапазонов 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 или 127.0.0.0/8.
Корректный адрес: ровно 4 части через точку, каждая — десятичное число 0–255 без ведущих нулей (0 допустим, 01 — нет). Некорректный адрес — False.
Задание 2Теория и инструменты
SSRF — атака, когда сервер по запросу пользователя ходит во внутреннюю сеть (http://127.0.0.1/admin, http://10.0.0.5).
Фильтр внутренних адресов должен строго разбирать формат: варианты вроде 010.0.0.1 или 10.0.0 разные библиотеки понимают по-разному, и этим пользуются для обхода.
Инструменты
- Python:
str.split,re.fullmatch - JS:
split, регулярные выражения
Больше теории — в разделе «Обучение: Защита (код)».
Задание 3Практика: напишите код
Примеры
is_private_ip("10.0.0.1")
→ trueis_private_ip("10.255.255.255")
→ trueis_private_ip("172.16.0.1")
→ trueЕщё 18 скрытых тестов.
Пошаговый план — открывайте по одному шагу
- 1Разбейте строку по точкам — частей должно быть ровно 4.
- 2Каждая часть: только цифры, без ведущих нулей (кроме самого
0), значение не больше 255. - 3Проверьте диапазоны по первому и второму октету: 10.x, 127.x, 172.16–31.x, 192.168.x.
- 4Любое нарушение формата —
False.
Подсказки — каждая до решения стоит −25 очков
Задание 4Как защититься
Для SSRF проверяйте адрес после DNS-резолва, запрещайте редиректы во внутреннюю сеть и выпускайте сервер наружу через прокси с белым списком.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.