python django download x-sendfile protected-resource

python - Django-Entendiendo X-Sendfile



download protected-resource (1)

He estado investigando acerca de las descargas de archivos con control de acceso, usando Django. Mi objetivo es bloquear completamente el acceso a un archivo, excepto cuando es accedido por un usuario específico. He leído que al usar Django, X-Sendfile es uno de los métodos de elección para lograr esto (basado en otras preguntas de SO, etc.). Mi comprensión rudimentaria de usar X-Sendfile con Django es:

  1. El usuario solicita URI para obtener un archivo protegido
  2. La aplicación Django decide qué archivo devolver en función de la URL, y verifica el permiso del usuario, etc.
  3. La aplicación Django devuelve una respuesta HTTP con el encabezado ''X-Sendfile'' establecido en la ruta del archivo del servidor
  4. El servidor web encuentra el archivo y lo devuelve al solicitante (supongo que el servidor web también elimina el encabezado ''X-Sendfile'' en el camino)

Comparado con el uso del archivo directamente desde Django, X-Sendfile parece ser un método más eficiente para lograr descargas protegidas (ya que puedo confiar en que Nginx sirva los archivos, vs Django), pero me deja 2 preguntas:

  1. ¿Es mi explicación de X-Sendfile al menos abstracta de manera abstracta?
  2. ¿Es realmente seguro, asumiendo que no proporciono acceso HTTP de front-end normal (por ejemplo, http://www.example.com/downloads/secret-file.jpg ) al directorio en el que está almacenado el archivo (es decir, don No lo guardo en mi directorio public_html )? O, ¿podría un usuario experto en tecnología examinar los encabezados, etc. y realizar una ingeniería inversa de una manera de acceder a un archivo (para luego distribuirlo)?
  3. ¿Es realmente una gran diferencia en el rendimiento. ¿Voy a atascar mi servidor de aplicaciones proporcionando 8b descargas de archivos de 150Mb directamente desde Django, o es una especie de no problema? La razón por la que lo pregunto es porque si ambas versiones son casi iguales, la versión de Django sería preferible debido a mi capacidad para hacer cosas en Python, como registrar el número de descargas completadas, el ancho de banda total de las descargas, etc.

Gracias por adelantado.


  1. Sí, así es como funciona.
  2. La implementación exacta depende del servidor web, pero en el caso de nginx, se recomienda marcar la ubicación como interna para evitar el acceso externo.
  3. Nginx puede servir archivos de forma asíncrona, mientras que con Django necesita un subproceso por solicitud que puede causar problemas para un mayor número de solicitudes paralelas.

Recuerde enviar un encabezado X-Accel-Redirect para nginx en lugar de X-Sendfile. Consulte http://wiki.nginx.org/XSendfile para obtener más información.