Подтвердить что ты не робот

Django - Понимание X-Sendfile

Я занимаюсь некоторыми исследованиями в отношении загрузки файлов с контролем доступа, используя 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)? Или, может ли технический специалист проверить заголовки и т.д. И перепроектировать способ доступа к файлу (чтобы потом распространить)?
  • Это действительно большая разница в производительности. Могу ли я запугать свой сервер приложений, предоставив 8b chunked загрузки файлов размером 150 МБ непосредственно из Django или это не проблема? Причина, по которой я спрашиваю, заключается в том, что, если обе версии близки, версия Django предпочтительнее из-за моей способности делать вещи на Python, например, регистрировать количество завершенных загрузок, пропускную способность загрузки и т.д.

Спасибо заранее.

4b9b3361

Ответ 1

  • Да, это как раз то, как это работает.
  • Точная реализация зависит от веб-сервера, но в случае nginx рекомендуется пометить местоположение как внутреннее, чтобы предотвратить внешний доступ.
  • Nginx может асинхронно обслуживать файлы, а в Django вам нужен один поток для запроса, который может стать проблематичным для большего количества параллельных запросов.

Не забудьте отправить заголовок X-Accel-Redirect для nginx вместо X-Sendfile. Подробнее см. http://wiki.nginx.org/XSendfile.