Segurança para acesso a arquivos com .htaccess

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:

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:
xxxxxxxxxx
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:
xxxxxxxxxx
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
xxxxxxxxxx
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
xxxxxxxxxx
/* 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);
O conteudo foi útil? Isso é fantástico. Quer incentivar mais posts como esse? Mostre seu apoio com qualquer valor.
Chave PIX: d0311e58-cb6e-4d47-b3d8-3d4254763ce7