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:
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);
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