Правила доступа
Задание 1Введение
Цель: Писать правила доступа по шаблонам путей.
Напишите path_allowed(path, rules). Правило — allow:шаблон или deny:шаблон. В шаблоне * — любые символы кроме /, ** — любые символы. Шаблон должен совпасть со всем путём. Решает последнее совпавшее правило; если ни одно не совпало — запрет.
Задание 2Теория и инструменты
Порядок правил важен: «последнее совпадение выигрывает» — как в .gitignore. По умолчанию запрет.
Ошибки в шаблонах (* захватывает /) открывают доступ к вложенным путям.
Инструменты
- Python 3 или Node.js
- Встроенные тесты в редакторе
Больше теории — в разделе «Обучение: Защита (код)».
Задание 3Практика: напишите код
Примеры
path_allowed("/public/a.css", ["allow:/public/**"])
→ truepath_allowed("/admin", ["allow:/**", "deny:/admin"])
→ falseЕщё 6 скрытых тестов.
Пошаговый план — открывайте по одному шагу
- 1Переведите шаблон в регулярное выражение:
**→.*,*→[^/]*, остальное экранируйте. - 2Проверяйте полное совпадение.
- 3Пройдите все правила и запомните решение последнего совпавшего.
Подсказки — каждая до решения стоит −100 очков
Задание 4Как защититься
Нормализуйте путь (.., //, процентное кодирование) до проверки правил.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.