Como protejo downloads de arquivos grandes por meio de PHP e/ou Apache?

Como protejo downloads de arquivos grandes por meio de PHP e/ou Apache?

Temos alguns arquivos grandes (1 a 8 GB) que não são acessíveis publicamente. Atualmente estamos servindo-os através de um script PHP que armazena os arquivos em pedaços de 1 MB e os grava na saída. É incrivelmente intensivo em CPU e torna o servidor lento quando apenas alguns downloads estão ativos. Queremos mover o trabalho de transferência de arquivos para o Apache ou para um método mais eficiente. Estamos usando autenticação de cookie. Os downloads de FTP estão desativados, a menos que haja alguma maneira de autenticar sessões de FTP por meio do cookie de sessão PHP existente.

Idealmente, gostaríamos de algo onde pudéssemos usar o PHP para ocultar o link para o arquivo enquanto ele transfere o trabalho de transferência de arquivos para o Apache, que é sem dúvida muito mais eficiente em transferências de arquivos HTTP do que o PHP. Queremos poder retomar os downloads também.

Qualquer ajuda é apreciada.

Responder1

X-Sendfile é feito especificamente para este tipo de operação. Você pode ler sobre isso emhttp://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/

Responder2

mod_auth_tkt parece interessante. Aqui está uma solução de baixa tecnologia se sua configuração Apache/PHP estiver hospedada no UNIX:

Mantenha seus downloads em um diretório não acessível pela Web e use um script PHP para criar links simbólicos exclusivos para ele. Então você pode excluir os links simbólicos após um período de tempo especificado (por exemplo, após 24 horas).

Aqui está um exemplo. Suponha que seus arquivos estejam armazenados em/private e protegidos por um arquivo .htaccess. Você também tem um diretório /public que pode ser gravado pelo usuário sob o qual o Apache é executado.

Pseudo-código:

  1. O usuário vai para a página de download
  2. O script PHP gera um ID de download exclusivo para ser usado como nome de arquivo do link simbólico (exemplo: 79467404-7585-11df-9ead-0022190d59d2)
  3. O script PHP cria um link simbólico de /public/79467404-7585-11df-9ead-0022190d59d2 para /private/file1
  4. O script PHP redireciona o usuário parahttp://example.com/public/79467404-7585-11df-9ead-0022190d59d2permitindo download de arquivos

Você pode então usar um cronjob para executar um "find /public -type l -mtime +24 -exec rm {} \;" ou algo semelhante para excluir links simbólicos expirados. (Observação: tenha muito cuidado ao usar find para excluir arquivos.)

Esta solução não impede que alguém compartilhe o link pelas próximas 24 horas, portanto provavelmente não é apropriada em situações em que isso seja importante. Mas não requer nenhum módulo Apache adicional, etc.

Responder3

Esta questão do Serverfaultpoderia estar relacionado. Alternativamente, você poderia usar algo comomod_auth_tkt.

Responder4

Eu usei uma chamada de serviço Net 2 FTP, que é uma interface HTML/PHP pura para acessar contas FTP online. Você pode baixar e instalar o software com relativa facilidade e não há sobrecarga, pois é um site muito pequeno.

Este software é extremamente útil e fácil de usar, parece perfeito para seu uso.

A página inicial éhttp://www.net2ftp.com/, é totalmente gratuito.

informação relacionada