¿Cómo protejo las descargas de archivos grandes a través de PHP y/o Apache?

¿Cómo protejo las descargas de archivos grandes a través de PHP y/o Apache?

Tenemos algunos archivos grandes (1-8 GB) a los que no se puede acceder públicamente. Actualmente los estamos entregando a través de un script PHP que almacena los archivos en fragmentos de 1 MB y los escribe en la salida. Consume increíblemente CPU y ralentiza el servidor cuando solo hay unas pocas descargas activas. Queremos trasladar el trabajo de transferencia de archivos a Apache o a un método más eficiente. Estamos utilizando autenticación de cookies. Las descargas FTP están disponibles a menos que haya alguna manera de autenticar las sesiones FTP a través de la cookie de sesión PHP existente.

Idealmente, nos gustaría algo en lo que podamos usar PHP para ocultar el enlace al archivo mientras pasa el trabajo de transferencia de archivos a Apache, que sin duda es mucho más eficiente en transferencias de archivos HTTP que PHP. También queremos poder reanudar las descargas.

Se agradece cualquier ayuda.

Respuesta1

X-Sendfile está diseñado específicamente para este tipo de operación. Puedes leer sobre esto enhttp://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/

Respuesta2

mod_auth_tkt parece interesante. Aquí hay una solución de baja tecnología si su configuración de Apache/PHP está alojada en UNIX:

Mantenga sus descargas en un directorio no accesible desde la Web y luego use un script PHP para crear enlaces simbólicos únicos en él. Luego puede eliminar los enlaces simbólicos después de un período de tiempo específico (por ejemplo, después de 24 horas).

He aquí un ejemplo. Suponga que sus archivos están almacenados en/privado y protegidos por un archivo .htaccess. También tiene un directorio /public en el que puede escribir el usuario bajo el que se ejecuta Apache.

Pseudocódigo:

  1. El usuario va a la página de descarga.
  2. El script PHP genera una identificación de descarga única que se utilizará como nombre de archivo del enlace simbólico (ejemplo: 79467404-7585-11df-9ead-0022190d59d2)
  3. El script PHP crea un enlace simbólico desde /public/79467404-7585-11df-9ead-0022190d59d2 a /private/file1
  4. El script PHP redirige al usuario ahttp://ejemplo.com/public/79467404-7585-11df-9ead-0022190d59d2permitiendo la descarga de archivos

Luego puede usar un cronjob para ejecutar "find /public -type l -mtime +24 -exec rm {} \;" o algo similar para eliminar enlaces simbólicos caducados. (NB: tenga mucho cuidado al utilizar buscar para eliminar archivos).

Esta solución no impide que alguien comparta el enlace durante las próximas 24 horas, por lo que probablemente no sea apropiada en situaciones en las que eso es importante. Pero no requiere ningún módulo Apache adicional, etc.

Respuesta3

Esta pregunta sobre Serverfaultpodría estar relacionado. Alternativamente, podrías usar algo comomod_auth_tkt.

Respuesta4

He utilizado un servicio llamado Net 2 FTP, que es una interfaz puramente html/PHP para acceder a cuentas FTP en línea. Puede descargar e instalar el software con relativa facilidad y no tiene gastos generales ya que es un sitio web muy pequeño.

Este software es extremadamente útil y fácil de usar, parece que sería perfecto para su uso.

La página de inicio eshttp://www.net2ftp.com/, es completamente gratuito.

información relacionada