SQL Injection
Definição
SQL Injection é um tipo de ataque que ocorre quando comandos SQL maliciosos são inseridos em campos de entrada da aplicação, com o objetivo de manipular consultas ao banco de dados.
Esse ataque é possível quando a aplicação não valida ou não trata corretamente os dados enviados pelo usuário, permitindo que comandos inesperados sejam executados.
Consequências possíveis:
- Vazamento de dados sensíveis;
- Modificação ou exclusão de dados;
- Bypass de autenticação;
- Comprometimento total do banco de dados.
Objetivos da Prevenção de SQL Injection
- Proteger o banco de dados contra comandos não autorizados enviados por usuários mal-intencionados.
- Garantir a integridade e confidencialidade dos dados.
- Evitar falhas de segurança que permitam acesso indevido a credenciais, dados financeiros ou informações confidenciais.
- Cumprir boas práticas e requisitos de conformidade, como OWASP Top 10, PCI-DSS e LGPD.
Exemplo de ataque SQL Injection
Suponha o seguinte código em Python (inseguro):
usuario = input("Usuário: ")
senha = input("Senha: ")
query = f"SELECT * FROM usuarios WHERE usuario = '{usuario}' AND senha = '{senha}'"
Se o atacante digitar como nome de usuário:
'admin' OR '1'='1
A consulta gerada será:
SELECT * FROM usuarios WHERE usuario = 'admin' OR '1'='1' AND senha = '...'
Isso é perigoso porque a expressão '1'='1'
é sempre verdadeira, e devido à precedência dos operadores, a consulta pode ser interpretada como:
usuario = 'admin' OR ('1'='1' AND senha = '...').
Se o nome de usuário 'admin'
existir, o banco pode retornar esse usuário mesmo com a senha incorreta, burlando a autenticação.
Assim, o hacker consegue acesso sem precisar da senha real.
Como prevenir
Use consultas parametrizadas (prepared statements): a forma mais eficaz de evitar SQL Injection.
Valide e sanitize todos os dados de entrada.
Evite concatenar strings diretamente em consultas SQL.
Limite privilégios do usuário do banco de dados.
Monitore e registre atividades suspeitas no banco.
Exemplo seguro — usando parâmetros com SQLite (Python)
import sqlite3
conn = sqlite3.connect('banco.db')
cursor = conn.cursor()
usuario = input("Usuário: ")
senha = input("Senha: ")
# Consulta segura com parâmetros
cursor.execute("SELECT \* FROM usuarios WHERE usuario = ? AND senha = ?", (usuario, senha))
resultados = cursor.fetchall()
if resultados:
print("Login bem-sucedido.")
else:
print("Usuário ou senha inválidos.")
O ciclo da proteção contra SQL Injection
[Entrada do usuário] → [Validação e sanitização] → [Consulta parametrizada] → [Resposta segura do banco]
Toda entrada deve ser tratada como potencialmente maliciosa.
O banco só deve executar o que foi explicitamente previsto pela aplicação.