Desativando funções perigosas do PHP no php.ini para maior segurança

Métodos para desativar funções PHP potencialmente perigosas no php.ini, prevenindo exploração de vulnerabilidades e ataques remotos.

Introdução

O PHP possui diversas funções que, se mal utilizadas, podem representar um risco para a segurança da aplicação. Funções que permitem a execução de comandos do sistema operacional ou manipulação direta de arquivos podem ser exploradas por atacantes para comprometer o servidor. Desativá-las no php.ini é uma das formas mais eficazes de proteger a aplicação.

1. Identificando funções PHP perigosas

Algumas funções do PHP podem ser usadas para executar comandos no servidor, modificar arquivos ou até abrir conexões externas sem controle. As mais perigosas incluem:

  • exec()
  • shell_exec()
  • system()
  • passthru()
  • popen()
  • proc_open()
  • eval()
  • base64_decode() (pode ser usada para ocultar código malicioso)

Se a aplicação não precisa dessas funções, é altamente recomendável desativá-las.

2. Desativando funções perigosas no php.ini

Abra o arquivo php.ini e localize a diretiva disable_functions. Adicione as funções que deseja bloquear:

disable_functions = exec, shell_exec, system, passthru, popen, proc_open, eval, base64_decode

Após essa configuração, reinicie o servidor para que as mudanças tenham efeito:

sudo systemctl restart apache2  # Para Apache
sudo systemctl restart nginx    # Para Nginx

3. Verificando se as funções estão realmente desativadas

Podemos testar se as funções foram bloqueadas executando o seguinte código:

if (in_array('exec', explode(',', ini_get('disable_functions')))) {
    echo 'A função exec() está desativada!';
} else {
    echo 'A função exec() ainda está ativa!';
}

Se a configuração estiver correta, a função exec() não será executada e retornará a mensagem de bloqueio.

4. Protegendo o php.ini contra modificações

Um atacante pode tentar reverter as configurações de segurança alterando o php.ini. Para evitar isso, podemos definir permissões restritas para o arquivo:

sudo chmod 444 /etc/php/8.1/apache2/php.ini

Isso impede que usuários não autorizados alterem as configurações do PHP.

5. Monitorando tentativas de execução de funções bloqueadas

Manter logs das tentativas de uso de funções desativadas pode ajudar a identificar atividades suspeitas. Podemos configurar um log customizado para registrar essas tentativas:

function tentarExecutar($comando) {
    error_log("Tentativa de executar: $comando", 3, '/var/log/php_security.log');
    die("Operação não permitida!");
}

if (function_exists('exec')) {
    tentarExecutar('exec');
}

Isso impede a execução e registra tentativas suspeitas no log /var/log/php_security.log.

Conclusão

Desativar funções perigosas no php.ini é uma medida essencial para evitar que aplicações PHP sejam exploradas para execução remota de código ou comprometimento do servidor. Ao bloquear funções inseguras, restringir permissões do php.ini e monitorar tentativas de exploração, podemos reforçar significativamente a segurança da aplicação.

O PHP é uma linguagem poderosa, mas também pode ser um alvo fácil para atacantes se funções perigosas estiverem ativas. Muitas brechas de segurança ocorrem porque aplicações permitem a execução de comandos no servidor sem as devidas restrições.

A melhor forma de mitigar esse risco é desativar funções como exec(), system() e popen() no php.ini, garantindo que scripts maliciosos não possam explorá-las. Além disso, manter logs de tentativas de uso dessas funções ajuda a identificar atividades suspeitas antes que se tornem um problema.

Com a implementação dessas práticas, evitamos um dos tipos de ataque mais comuns em aplicações PHP, reduzindo significativamente as chances de exploração de vulnerabilidades no servidor.

Algumas aplicações:

  • Evitar que atacantes executem comandos no sistema operacional via PHP.
  • Reduzir o risco de exploração remota e injeção de código malicioso.
  • Proteger o servidor contra ataques automatizados que exploram funções perigosas.
  • Reforçar a segurança de ambientes compartilhados onde múltiplos usuários têm acesso ao servidor.

Dicas para quem está começando

  • Verifique se sua aplicação realmente precisa de funções como exec() e shell_exec() antes de ativá-las.
  • Adicione funções perigosas à diretiva disable_functions no php.ini.
  • Restrinja permissões do php.ini para impedir modificações não autorizadas.
  • Monitore logs do PHP para identificar tentativas de uso de funções bloqueadas.
  • Após qualquer alteração no php.ini, reinicie o servidor para aplicar as configurações.

Contribuições de Renata Oliveira

Compartilhe este tutorial: Como desativar funções perigosas do PHP no php.ini para aumentar a segurança?

Compartilhe este tutorial

Continue aprendendo:

Como armazenar logs de erros no PHP sem comprometer a segurança?

Métodos para armazenar logs de erros no PHP sem comprometer a segurança, garantindo que informações sensíveis não sejam expostas.

Tutorial anterior

Como limitar o tempo de sessão no PHP para reduzir riscos de sequestro?

Métodos para limitar o tempo de sessão no PHP, prevenindo sequestro de sessão e aumentando a segurança da aplicação.

Próximo tutorial