Джанго - Понимание X-Sendfile - PullRequest
       41

Джанго - Понимание X-Sendfile

27 голосов
/ 04 сентября 2011

Я проводил некоторые исследования по загрузке файлов с контролем доступа, используя Django.Моя цель - полностью заблокировать доступ к файлу, кроме случаев, когда к нему обращается определенный пользователь.Я читал, что при использовании Django X-Sendfile является одним из методов выбора для достижения этой цели (на основе других вопросов SO и т. Д.).Мое элементарное понимание использования X-Sendfile с Django таково:

  1. Пользователь запрашивает URI для получения защищенного файла
  2. Приложение Django решает, какой файл возвращать на основе URL-адреса, и проверяет разрешение пользователяи т. д.
  3. Приложение Django возвращает HTTP-ответ с заголовком 'X-Sendfile', установленным на путь к файлу сервера
  4. Веб-сервер находит файл и возвращает его запрашивающей стороне (я полагаю,веб-сервер также удаляет заголовок 'X-Sendfile' по пути)

По сравнению с переносом файла непосредственно из Django, X-Sendfile, вероятно, является более эффективным методом достижения защищенных загрузок.(так как я могу полагаться на Nginx для обслуживания файлов, против Django), но оставляю для меня 2 вопроса:

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

Заранее спасибо.

1 Ответ

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

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

...