Como proteger arquivos para download em um diretório remoto de usuários não premium (no PHP?)

StackOverflow https://stackoverflow.com/questions/1550071

Pergunta

Estou construindo uma seção "Premium" do meu site e estou precisando dar acesso ao download de arquivos diretamente em um controle remoto (em um servidor diferente), para usuários com privilégios especiais (contas armazenadas no MySQL DB). Meu site está codificado no PHP/MYSQL para que uma solução PHP seja ótima.

Foi útil?

Solução

Direcione todos os links de download para um arquivo php que fará toda a verificação de credenciais.

Você pode chamar o arquivo download.php

Passe os parâmetros por meio de cookies, obtenha, postagem, sessão ou qualquer maneira que você verifique os privilégios.

Depois que as credenciais forem verificadas, você pode enviar um cabeçalho apropriado.

Se for uma imagem, o cabeçalho seria header("Content-type: image/jpeg");

Suponho que você também possua este servidor remoto.

Alguns links úteis:

MIME TIPOS

Função do cabeçalho do PHP

Outras dicas

Como @pxl disse, você precisa verificar a autorização e, em seguida, produzir o tipo MIME correto como um cabeçalho HTML (como ele disse: header("Content-type: image/jpeg");)

Além disso, depois de terminar com isso, você precisará gerar o conteúdo real do arquivo e seu tamanho (em bytes) como tal:

header("Content-Length: ".filesize("FILENAME")*1.001);
/* The *1.001 puts a nice buffer on the filesize, I read about it online.
Browsers will stop downloading exactly at the Content-Length, but if they go
over, it's not a big deal at all. */
readfile("FILENAME");
die();

Apenas certifique -se de armazenar o arquivo em um diretório que não é acessível na Web.

Estou acostumado a fazer isso em asp.net onde está construído, mas este artigo parece narrar sua situação exata.

Aqui está o que eu faria:

  1. Construiu um PHP-SOAP-SEVER no servidor remoto B que contém os arquivos.

  2. Sempre que um usuário acionar um download no seu servidor principal, conecte-se ao servidor de sabão em B e reserve um ticket para o usuário que especifica um endereço IP e o ID/caminho do arquivo para baixar.

  3. O servidor B agora criará um ticketid (que deve ser válido apenas por um tempo limitado) para este download e devolvê -lo a A.

  4. Servidor A redireciona o usuário para o servidor B fornecendo o ticketid como um parâmetro GET

  5. O servidor B agora verifica se o ticket já foi usado, expirou ou se o usuário vier do IP errado. Se nenhum deles se aplicar, sirva o arquivo e marque o ticket conforme usado.

Nota: No servidor B, não mantenha o PHP em execução enquanto serve o arquivo, mas use o Cabeçalho X-Sendfile em vez de. Caso contrário, o download poderá parar após o tempo de execução do PHP Max.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top