Publicidade

segunda-feira, 12 de outubro de 2026

SQL Injection em PHP: Como Fechar as Portas para o Atacante

 


Apesar de ser uma das vulnerabilidades mais antigas e conhecidas da web (presente no Top 10 da OWASP há décadas), o SQL Injection (SQLi) continua derrubando aplicações em PHP todos os dias.

Muitos desenvolvedores ainda confiam em "limpezas" manuais de strings ou funções desatualizadas, abrindo brechas críticas para que atacantes extraiam, modifiquem ou apaguem bancos de dados inteiros.

Se você desenvolve em PHP, aqui estão as regras de ouro para blindar o seu código:

Dicas Práticas para Evitar SQL Injection em PHP

  1. Abandone Funções Nativas Antigas (MySQL/Extensões Obsoletas) Se o seu código ainda utiliza as funções mysql_* (removidas há anos) ou mesmo o driver antigo ext/mysql, você está operando em risco extremo. Migre obrigatoriamente para PDO (PHP Data Objects) ou MySQLi.

  2. Utilize Sempre Prepared Statements (Declarações Preparadas) Esta é a linha de defesa definitiva. Quando você usa Prepared Statements, o banco de dados trata os dados fornecidos pelo usuário estritamente como valores, e nunca como código executável. O parser do SQL separa a estrutura da consulta dos parâmetros, neutralizando o ataque mesmo se o input contiver comandos maliciosos.

    Exemplo seguro com PDO:

    PHP
    $stmt = $pdo->prepare('SELECT id, nome FROM usuarios WHERE email = :email'); $stmt->execute(['email' => $userInput]); $usuario = $stmt->fetch();
  3. Nunca Concatene Variáveis Diretamente na Query O erro clássico que gera SQLi é montar consultas usando interpolação de strings ou concatenação direta:

    • ❌ Errado: $db->query("SELECT * FROM users WHERE id = " . $_GET['id']);

    • Se o parâmetro não for validado rigorosamente, o atacante injeta comandos como OR 1=1 ou UNION SELECT. Sempre utilize placeholders (? ou parâmetros nomeados como :id).

  4. Validação e Tipagem Estrita de Dados Além de usar Prepared Statements, valide o tipo do dado na entrada. Se um campo espera um ID numérico, force a tipagem no PHP ((int)$_GET['id'] ou filter_var($_GET['id'], FILTER_VALIDATE_INT)). Reduzir a margem do que é aceito diminui a superfície de ataque.

  5. Princípio do Menor Privilégio no Banco de Dados A aplicação web nunca deve se conectar ao SGBD (MySQL/MariaDB) utilizando o usuário root ou um usuário com permissões globais de DROP, ALTER ou GRANT. Crie um usuário de banco dedicado para a aplicação, com permissões restritas estritamente ao necessário (SELECT, INSERT, UPDATE, DELETE) nas tabelas em uso.

A segurança de uma aplicação web começa na base do código. Escrever código limpo e seguro não é apenas uma boa prática de desenvolvimento, é uma obrigação de cibersegurança.

Como sua equipe lida com a revisão de código para evitar falhas de injeção em projetos legados em PHP? Compartilhe nos comentários!

#CyberSecurity #PHP #WebDevelopment #SQLInjection #SecureCoding #Infosec #DevSecOps

Nenhum comentário:

Postar um comentário