Условие требует, чтобы model_path / PERMITTED_SUBPATH был одним из родителей request_path. Если это не так, выбрасывается PermissionDenied. Это проверка вложенности, но не полная защита файлового доступа.
Валидация пути и блокировка доступа
Условие требует, чтобы model_path / PERMITTED_SUBPATH был одним из родителей request_path. Если это не так, выбрасывается PermissionDenied. Это проверка вложенности, но не полная защита файлового доступа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разберите работу следующего кода и предложите комментарий, который пояснит его назначение.
if model_path / PERMITTED_SUBPATH not in request_path.parents:
raise django.core.exceptions.PermissionDenied()
Опишите, что проверяется в условии и почему в случае несоответствия генерируется исключение.
Ответ
Условие требует, чтобы model_path / PERMITTED_SUBPATH был одним из родителей request_path. Если это не так, выбрасывается PermissionDenied. Это проверка вложенности, но не полная защита файлового доступа.
Подходящий комментарий: «Запретить запрос, если запрошенный путь не находится строго внутри разрешённого подкаталога».
Оператор / соединяет части Path; parents содержит предков и не содержит сам request_path. Поэтому равенство разрешённому пути не проходит проверку. Сравнение лексических путей не устраняет автоматически .., симлинки и подмену файла между проверкой и открытием. Для реальной защиты нужно нормализовать пути, ограничить доверенные корни и учитывать TOCTOU; одной этой строки недостаточно для гарантии безопасности.