Melhores Práticas para Desenvolvimento Seguro em PHP

07/06/2024

Melhores Práticas para Desenvolvimento Seguro em PHP


A segurança é uma preocupação fundamental no desenvolvimento de aplicações web. No PHP, um conjunto robusto de práticas de segurança é essencial para proteger a aplicação contra ameaças comuns. Este artigo detalha as melhores práticas e ferramentas para garantir um desenvolvimento seguro em PHP.

Validação e Saneamento de Dados

Uma das principais causas de vulnerabilidades em aplicações PHP é a falta de validação e saneamento de dados. Dados de entrada nunca devem ser confiados e devem ser sempre validados e saneados.

  • Validação de Dados: Verifique se os dados atendem aos critérios esperados (tipo, formato, valor). Por exemplo, para validar um email:


  1. if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {  
  2.     // Email inválido  
  3. }  

  • Saneamento de Dados: Remova ou escape caracteres indesejados de dados de entrada. Por exemplo, para saneamento básico de uma string:

  1. $sanitized_string = filter_var($input, FILTER_SANITIZE_STRING);  

Prevenção contra SQL Injection

SQL Injection é uma das vulnerabilidades mais perigosas. Usar consultas parametrizadas com PDO ou MySQLi é essencial.

  • PDO com Prepared Statements:



  1. $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');  
  2. $stmt->execute(['email' => $email]);  
  3. $user = $stmt->fetch();  

MySQLi com Prepared Statements:


Usar Prepared Statements com MySQLi é uma prática recomendada para evitar SQL Injection, pois garante que os dados fornecidos pelo usuário sejam tratados corretamente antes de serem incluídos em uma consulta SQL.

Benefícios dos Prepared Statements

  1. Segurança: Protege contra SQL Injection ao separar a lógica SQL dos dados.
  2. Eficiência: Permite que o banco de dados reutilize o plano de execução da consulta.
  3. Manutenibilidade: Facilita a manutenção do código, separando a lógica da consulta dos dados.

  1. $stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');  
  2. $stmt->bind_param('s'$email);  
  3. $stmt->execute();  
  4. $result = $stmt->get_result();  
  5. $user = $result->fetch_assoc();  

Proteção Contra Cross-Site Scripting (XSS)

XSS permite que atacantes injetem scripts maliciosos em páginas web vistas por outros usuários. Para prevenir XSS, sempre escape dados antes de exibi-los.

  • Função htmlspecialchars:


  1. echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');  

Utilização de bibliotecas:

 Ferramentas como HTML Purifier podem ser usadas para limpar HTML de entrada.


  1. require_once 'HTMLPurifier.auto.php';  
  2. $purifier = new HTMLPurifier();  
  3. $clean_html = $purifier->purify($dirty_html);  

Proteção Contra Cross-Site Request Forgery (CSRF)

CSRF ocorre quando um atacante faz com que o usuário autenticado execute ações não intencionadas em um aplicativo web. Tokens CSRF podem ajudar a prevenir esses ataques.

  • Geração e Verificação de Tokens CSRF:

  1. // Geração  
  2. if (emptyempty($_SESSION['csrf_token'])) {  
  3.     $_SESSION['csrf_token'] = bin2hex(random_bytes(32));  
  4. }  
  5.   
  6. // Inclusão no Formulário  
  7. echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';  
  8.   
  9. // Verificação  
  10. if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {  
  11.     // Token válido  
  12. else {  
  13.     // Token inválido  
  14. }  

Uso de Ferramentas de Análise Estática

Ferramentas de análise estática podem identificar vulnerabilidades em seu código antes mesmo de serem executadas.

  • PHPStan: Uma ferramenta de análise estática para PHP.

  • Psalm: Outra ferramenta popular para análise estática.

Configurações de Segurança no PHP

A configuração correta do PHP também é crucial para a segurança.

  • Desabilitar display_errors em produção: Exibir erros pode revelar informações sensíveis.


  1. display_errors = Off  

Uso de session.cookie_httponly e session.cookie_secure: Para proteger cookies de sessão.


  1. session.cookie_httponly = 1  
  2. session.cookie_secure = 1  

Desabilitar funções perigosas: Algumas funções como exec, shell_exec, e eval podem ser desabilitadas para aumentar a segurança.


  1. disable_functions = exec,shell_exec,passthru,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source  

a desabilitação de funções perigosas é feita no arquivo de configuração do PHP, chamado php.ini.

Procure pela diretiva disable_functions e adicione as funções que você deseja desabilitar. Se a diretiva não estiver presente, você pode adicioná-la.

Reinicie o servidor web: Após editar o arquivo php.ini, é necessário reiniciar o servidor web para que as mudanças tenham efeito. O comando para reiniciar o servidor web varia dependendo do servidor que você está usando. Aqui estão alguns exemplos:

  • Para Apache:



        sudo systemctl restart apache2

Por que Desabilitar Funções Perigosas?

Desabilitar funções perigosas é uma medida de segurança preventiva. Algumas funções podem ser exploradas por atacantes para executar comandos arbitrários no servidor, acessar arquivos confidenciais ou causar outros danos. Ao desabilitar essas funções, você reduz a superfície de ataque da sua aplicação.

Funções Comumente Desabilitadas

  • exec(): Executa um comando externo.
  • shell_exec(): Executa um comando via shell e retorna a saída como uma string.
  • passthru(): Executa um comando externo e exibe a saída bruta.
  • system(): Executa um comando e retorna a última linha da saída.
  • proc_open(): Abre um processo e conecta stdin, stdout e stderr ao PHP.
  • popen(): Abre um processo e retorna um ponteiro de arquivo.
  • curl_exec(): Executa uma sessão cURL.
  • curl_multi_exec(): Executa operações cURL simultâneas.
  • parse_ini_file(): Analisa um arquivo INI e retorna seu conteúdo como um array.
  • show_source(): Mostra o código-fonte de um arquivo.

Ao seguir essas práticas, você ajuda a proteger seu ambiente PHP contra explorações maliciosas e ataques.