25 de maio
Apps
60 visualizações

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:

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

Um pouco sobre o autor

Matteus Barbosa - Desenvolvedor Web
                               
Trabalho como Desenvolvedor web desde 2013 e atualmente faço parte do quadro da Symplicity. Também atuo em projetos como profissional autônomo. Para saber da minha experiência, acesse meu Currículo, meu Portfólio, a relação de Referências de Clientes ou ainda a Lista de Serviços. As propostas de serviço são iniciadas com conversas informais, seguidas da coleta de requisitos, elaboração do cronograma e por fim a proposta de orçamento. Todas as etapas são acompanhados de perto via ferramenta online e videoconferências. Os pagamentos são registrados com entrega de notas fiscais. Presto serviços de projeto, desenvolvimento e manutenção de sistemas baseados nos mais diversos frameworks.