Evitando ataques de inclusão de arquivos (LFI e RFI) no PHP

Métodos eficazes para impedir ataques de inclusão de arquivos no PHP e evitar a execução de código malicioso no servidor.

Introdução

Os ataques de inclusão de arquivos (Local File Inclusion - LFI e Remote File Inclusion - RFI) permitem que um invasor carregue arquivos maliciosos no servidor e execute código arbitrário. Essa vulnerabilidade ocorre quando entradas do usuário são usadas diretamente em funções como include(), require() e file_get_contents() sem validação.

1. Entendendo LFI e RFI

  • LFI (Local File Inclusion): Permite a inclusão de arquivos locais do servidor.
  • RFI (Remote File Inclusion): Permite a inclusão de arquivos externos de servidores remotos.

Exemplo de código vulnerável:

$pagina = $_GET['pagina'];
include($pagina);

Se o atacante passar pagina=../../etc/passwd, ele pode acessar arquivos sensíveis do sistema.

2. Como evitar LFI e RFI no PHP

2.1. Não usar entradas do usuário diretamente

Nunca utilize variáveis do usuário para incluir arquivos sem validação.

2.2. Criar uma lista branca de arquivos permitidos

Uma abordagem segura é definir uma lista de arquivos válidos:

$paginas_permitidas = ['home.php', 'contato.php', 'sobre.php'];
$pagina = $_GET['pagina'] ?? 'home.php';
if (!in_array($pagina, $paginas_permitidas)) {
    die('Acesso negado!');
}
include($pagina);

Isso impede que usuários acessem arquivos não autorizados.

2.3. Normalizar caminhos e evitar subidas de diretório

Podemos restringir o caminho do arquivo usando realpath():

$base = realpath(__DIR__ . '/paginas/');
$arquivo = realpath($base . '/' . basename($_GET['pagina']));
if (strpos($arquivo, $base) !== 0 || !file_exists($arquivo)) {
    die('Arquivo inválido!');
}
include($arquivo);

Isso impede que o usuário acesse arquivos fora do diretório paginas/.

2.4. Desativar inclusão de arquivos remotos no php.ini

Para evitar RFI, desative a inclusão remota no PHP:

allow_url_include = Off
allow_url_fopen = Off

Isso impede que arquivos sejam carregados de servidores externos.

Conclusão

Os ataques de inclusão de arquivos são extremamente perigosos e podem comprometer um servidor inteiro. Validar entradas do usuário, usar listas brancas, normalizar caminhos e desativar inclusão remota são estratégias fundamentais para proteger aplicações PHP.

A inclusão de arquivos no PHP pode ser uma ferramenta poderosa, mas se não for usada corretamente, pode abrir portas para ataques graves. Muitos desenvolvedores cometem o erro de confiar nas entradas do usuário ao incluir arquivos, permitindo que invasores acessem dados sensíveis ou executem código malicioso.

Os ataques LFI e RFI podem ser prevenidos com boas práticas, como definir uma lista de arquivos permitidos, restringir o acesso a diretórios específicos e desativar a inclusão remota no php.ini. Essas medidas garantem que apenas arquivos autorizados sejam carregados, reduzindo significativamente os riscos de segurança.

A segurança em aplicações PHP deve ser uma prioridade. Pequenos descuidos podem levar a falhas críticas, comprometendo dados e a integridade do sistema. Implementar verificações rigorosas e evitar entradas dinâmicas em funções sensíveis é essencial para manter a aplicação protegida.

Algumas aplicações:

  • Impedir o carregamento de arquivos não autorizados na aplicação.
  • Proteger contra execução remota de código malicioso.
  • Evitar que usuários acessem arquivos sensíveis do servidor.
  • Reduzir vulnerabilidades que podem ser exploradas por atacantes.

Dicas para quem está começando

  • Nunca utilize entradas do usuário diretamente em include() ou require().
  • Crie uma lista de arquivos permitidos e valide a entrada antes de incluir arquivos.
  • Use realpath() e basename() para evitar subidas de diretório.
  • Desative allow_url_include no php.ini para impedir inclusão remota.
  • Restrinja permissões de arquivos e diretórios para evitar acessos não autorizados.
Foto de Gustavo Ferraz
Contribuições de
Gustavo Ferraz

Desenvolvedor backend com experiência em PHP, Java e integração de APIs em Node.js e Python.

Mais sobre o autor
Compartilhe este tutorial: Como evitar ataques de inclusão de arquivos (LFI e RFI) no PHP?

Compartilhe este tutorial

Continue aprendendo:

Como validar e sanitizar entradas do usuário corretamente no PHP?

Métodos para validar e sanitizar entradas do usuário no PHP, garantindo segurança contra ataques de injeção e manipulação de dados.

Tutorial anterior

Como proteger um site PHP contra ataques de força bruta?

Métodos para evitar ataques de força bruta em sites PHP, protegendo credenciais e impedindo tentativas automáticas de login.

Próximo tutorial