Безопасная загрузка файлов в web-продукте

MIME, storage вне web-root, antivirus и безопасная выдача пользователю.

Зачем разбирать эту тему

Расширению и Content-Type от клиента доверять нельзя. Сначала ограничиваем размер, затем определяем фактический MIME по содержимому и сравниваем с белым списком.

Как устроена задача на практике

Оригинальное имя хранится как metadata, физическое имя генерируется случайно. Файлы лучше держать вне web-root, чтобы даже ошибочно загруженный скрипт нельзя было выполнить по URL.

Что важно в production

Для корпоративного обмена можно добавить асинхронный antivirus scan и quarantine. Изображения полезно декодировать и сохранять заново проверенной библиотекой.

Типичные ошибки

Главная ошибка — выбирать технологию или паттерн раньше, чем сформулирован пользовательский сценарий и ограничения. Второй частый промах — проверять решение только на идеальном happy path и не продумывать восстановление после сбоя, повторный запрос и права доступа.

Практический вывод

Скачивание всегда проходит проверку owner/organization/share token. Знание UUID ссылки само по себе не является правом доступа.

  • фиксируйте допущения до реализации;
  • проверяйте решение на реальных данных и устройствах;
  • сохраняйте наблюдаемость и возможность безопасного отката;
  • усложняйте архитектуру только когда это подтверждает задача.
PSP / EDITORIAL

Есть задача, где это решение нужно применить на практике?

← Все материалыОбсудить проект ↗