sábado, 16 de outubro de 2021

Segurança para acesso a arquivos com .htaccess

apache

Criar algo desse tipo pode custar horas de tentativas. Veja como é possível direcionar uma requisição de arquivo para um script de validação próprio e retornar o arquivo por meio de cabeçalho modificado, a seguir:

obter arquivo de forma segura com htaccess e php
RewriteEngine On
RewriteCond %{HTTP:X-Download} !1
RewriteRule ^files\/(.+)\.(\w{3,4})$ /files_proxy.php?filename=$1.$2 [L]

O que desejamos com o código acima?

1. interceptar a requisição de download para determinado arquivo (ainda sem cabeçalho modificado), seguindo o padrão:

www.site.com.br/files/{qualquernomedearquivo}.{qualquerextensão}

2. Direcionar para um script com validações de segurança, chamado files_proxy.php, passando o nome como parâmetro filename da string:

RewriteRule ^files\/(.+)\.(\w{3,4})$ /files_proxy.php?filename=$1.$2 [L]

3. Finalmente permitir download do arquivo após validações, desde que informado cabeçalho http X-Download: 1

RewriteCond %{HTTP:X-Download} !1

O cabeçalho http modificado X-Download (que inventamos) pode também ser uma chave criptografada que só seu sistema conhece, para melhorar ainda mais a segurança.

Para permitir o download no script, é possível criar os cabeçalhos de resposta

/* Pegamos a string inteira $url */
$asset_info = fileinfo($url);
header('Pragma: public');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0, max-age=0');
header('Content-Description: File Transfer');
header('Content-Length: ' . $asset_info['size']);
header('Content-Type: ' . $asset_info['filetype']);
header('Content-Disposition: inline; filename=' . $asset_info['basename']);
header('Content-Transfer-Encoding: binary');
header("X-Download: 1");
readfile($url);
Este artigo foi lido 344+ vezes. Obrigado por ler até aqui! Gostou do conteúdo? Fique à vontade pra copiar e compartilhar. Ajude sempre seus colegas. O conhecimento muda vidas!
  • Página no LinkedIn
  • Página no GitHub
  • Perfil Stack Overflow
EnglishPortuguês