Я проводил некоторые исследования по загрузке файлов с контролем доступа, используя Django.Моя цель - полностью заблокировать доступ к файлу, кроме случаев, когда к нему обращается определенный пользователь.Я читал, что при использовании Django X-Sendfile является одним из методов выбора для достижения этой цели (на основе других вопросов SO и т. Д.).Мое элементарное понимание использования X-Sendfile с Django таково:
- Пользователь запрашивает URI для получения защищенного файла
- Приложение Django решает, какой файл возвращать на основе URL-адреса, и проверяет разрешение пользователяи т. д.
- Приложение Django возвращает HTTP-ответ с заголовком 'X-Sendfile', установленным на путь к файлу сервера
- Веб-сервер находит файл и возвращает его запрашивающей стороне (я полагаю,веб-сервер также удаляет заголовок 'X-Sendfile' по пути)
По сравнению с переносом файла непосредственно из Django, X-Sendfile, вероятно, является более эффективным методом достижения защищенных загрузок.(так как я могу полагаться на Nginx для обслуживания файлов, против Django), но оставляю для меня 2 вопроса:
- Является ли мое объяснение X-Sendfile хотя бы абстрактно правильным?
- это действительно безопасно, при условии, что я не предоставляю нормальный интерфейсный HTTP-доступ (например, http://www.example.com/downloads/secret-file.jpg) к каталогу, в котором хранится файл (т. е. не храните его в моем каталоге
public_html
))?Или, может ли опытный пользователь изучить заголовки и т. Д. И перепроектировать способ доступа к файлу (чтобы затем распространять его)? - Действительно ли это большая разница в производительности.Собираюсь ли я перегружать свой сервер приложений, предоставляя 8-битную загрузку 150-мегабайтных файлов напрямую из Django, или это не проблема?Причина, по которой я спрашиваю, состоит в том, что, если обе версии почти равны, версия Django была бы предпочтительнее из-за моей способности делать что-то в Python, например регистрировать количество завершенных загрузок, подсчет пропускной способности загрузок и т. Д.
Заранее спасибо.