SQL Injection é uma das técnicas de ataque mais comuns contra aplicações web que interagem com bancos de dados. Ele ocorre quando comandos SQL maliciosos são inseridos em campos de entrada de usuário, com o objetivo de manipular ou vazar dados da aplicação.
Como o ataque funciona
Imagine um formulário de login onde o backend executa a seguinte consulta ao banco de dados:
SELECT * FROM usuarios WHERE email = '$email' AND senha = '$senha'
Se o desenvolvedor não tratar adequadamente os dados fornecidos, um atacante pode digitar o seguinte no campo de email:
' OR 1=1 --
E qualquer valor qualquer no campo de senha, por exemplo:
abc
O SQL final executado seria:
SELECT * FROM usuarios WHERE email = '' OR 1=1 --' AND senha = 'abc'
Neste caso, o -- comenta o restante da query, e 1=1 sempre retorna verdadeiro. Isso faz com que o banco retorne todos os usuários e, dependendo da lógica do backend, o atacante pode entrar como o primeiro usuário da tabela (muitas vezes o administrador).
Outro exemplo: extraindo dados
Considere um campo de busca onde o código SQL é:
SELECT * FROM produtos WHERE nome LIKE '%$busca%'
Se o atacante enviar:
%' UNION SELECT nome, senha FROM usuarios --
O SQL resultante será:
SELECT * FROM produtos WHERE nome LIKE '%%' UNION SELECT nome, senha FROM usuarios --%'
Isso pode retornar dados sensíveis da tabela usuarios, como nomes e senhas (caso estejam em texto plano, o que já é outro problema).
Como se proteger
Use Prepared Statements (Consultas Preparadas)
Evite concatenar valores diretamente nas queries. Bibliotecas como PDO (PHP) ou ORM como Sequelize (Node.js), Eloquent (Laravel) e Hibernate (Java) oferecem suporte a esse recurso.
Valide e filtre entradas
Mesmo com consultas preparadas, é essencial validar e filtrar os dados que o usuário envia.
Use níveis de acesso restritos no banco
O usuário de banco de dados usado pela aplicação não deve ter permissões desnecessárias, como DROP TABLE ou ALTER.
Monitore e registre acessos suspeitos
Auditoria e logs ajudam a identificar tentativas de ataques.
SQL Injection é simples de executar e perigoso quando a aplicação está mal construída. Qualquer campo que interaja com o banco sem proteção é uma porta de entrada. A melhor defesa é a combinação de código seguro, consultas parametrizadas e validação rigorosa de entradas. Nunca confie nos dados que vêm do usuário, mesmo que o sistema pareça "interno" ou "controlado".