Фильтр загрузок
Задание 1Введение
Цель: Фильтровать загружаемые файлы по белому списку.
Напишите is_allowed_upload(filename). Разрешены только расширения png jpg jpeg gif pdf (без учёта регистра). Запретить: имя без расширения или начинающееся с точки, символы /, \ и нулевой байт, а также опасные промежуточные расширения php phtml php5 exe sh js html svg (например, shell.php.png).
Задание 2Теория и инструменты
Двойное расширение shell.php.png выполнится как PHP на неправильно настроенном Apache.
Белый список надёжнее чёрного: разрешаем известное, остальное запрещаем.
Инструменты
- Python 3 или Node.js
- Встроенные тесты в редакторе
Больше теории — в разделе «Обучение: Защита (код)».
Задание 3Практика: напишите код
Примеры
is_allowed_upload("cat.png")
→ trueis_allowed_upload("CAT.JPG")
→ trueЕщё 10 скрытых тестов.
Пошаговый план — открывайте по одному шагу
- 1Отсеките имена с
/,\и нулевым байтом. - 2Разбейте имя по точкам, проверьте последнее расширение по белому списку.
- 3Проверьте промежуточные расширения на опасные.
Подсказки — каждая до решения стоит −10 очков
Задание 4Как защититься
Храните загрузки вне корня сайта, под случайными именами и проверяйте содержимое, а не только имя.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.