2011-09-04 6 views
25

He estado investigando sobre descargas de archivos con control de acceso, usando Django. Mi objetivo es bloquear completamente el acceso a un archivo, excepto cuando se accede 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 utilizar X-Sendfile con Django es: solicitaDjango - Comprensión de X-Sendfile

  1. usuario URI para obtener un archivo protegido
  2. aplicación Django decide qué archivo de rendimiento basado en el URL, y el permiso controles de 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 'X-Sendfile' encabezado en el camino)

En comparación con tirar el archivo directamente de Django, X-Sendfile parece ser un método más eficiente de lograr descargas protegidas (ya que puedo confiar en Nginx para servir archivos, frente a Django), pero me deja 2 preguntas:

  1. ¿Mi explicación de X-Sendfile es al menos abstracta?
  2. ¿Es realmente seguro, suponiendo que no proporciono acceso HTTP de front-end normal (por ejemplo, http://www.example.com/downloads/secret-file.jpg) al directorio donde está almacenado el archivo (es decir, no lo guardo en mi directorio public_html)? O bien, ¿podría un usuario experto en tecnología examinar los encabezados, etc. e invertir la forma de acceder a un archivo (para luego distribuirlo)?
  3. ¿Es realmente una gran diferencia en el rendimiento. ¿Voy a atascar mi servidor de aplicaciones al proporcionar 8b descargas fragmentadas de archivos de 150Mb directamente desde Django, o es este tipo de no-problema? La razón que pido es porque si las dos versiones son casi iguales, la versión de Django sería preferible debido a mi capacidad de hacer cosas en Python, al igual que ingrese el número de descargas completas, ancho de banda total de descargas, etc

, gracias por adelantado.

+0

en los pasos que describí anteriormente, una cosa no está clara para mí: cuando dijo 'la aplicación Django devuelve una respuesta HTTP con el conjunto de encabezado X-Sendfile', ¿quién es el destinatario de esa respuesta? Supongo que será el servidor web (por ejemplo, nginx). Si ese es el caso, ¿quién inició la solicitud que maneja la aplicación Django en primer lugar? – MLister

+0

@MLister - el usuario (navegador web) - básicamente, desea configurar una vista como 'get_file (request, file_name)' (algo para ese efecto) y cuando un usuario visita la URL, devuelve una respuesta con ' X-Sendfile' que apunta a la ubicación correcta para el archivo nombrado (después de agregar cualquier lógica que desee en la vista para determinar si el usuario debe poder descargar el archivo).Nginx interceptará la respuesta al salir y devolverá una respuesta con el archivo (como una descarga). – orokusaki

+0

entonces 'nginx' debe estar configurado * delante * del servidor de aplicaciones' Django' entonces? De lo contrario, ¿cómo puede 'nginx' interceptar la respuesta al salir? – MLister

Respuesta

19
  1. Sí, así es cómo 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 asincrónicamente archivos mientras que con Django necesita un hilo por solicitud que puede ser problemático para un mayor número de solicitudes paralelas.

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