Defesa contra Injeção de SQL
Impeça ataques de injeção
Defesa contra Injeção de SQL é uma aula grátis de Cyber Security Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Cyber Security Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Cyber Security Academy inclui 4 aulas no total.
O Que É Injeção de SQL
Injeção de SQL (SQLi) ocorre quando uma entrada de usuário não confiável é concatenada diretamente a uma consulta SQL. O invasor insere sintaxe SQL em um campo que o aplicativo espera que contenha apenas dados, alterando o significado da consulta.
Ela continua sendo uma das vulnerabilidades web mais prejudiciais, pois pode vazar bancos de dados inteiros, contornar logins ou destruir dados.
Uma Consulta Vulnerável
O erro clássico é a concatenação de cadeias de caracteres. Se a entrada for tom, a consulta estará correta, mas uma entrada criada especialmente reescreverá a lógica.
- A aspa simples fecha a cadeia de caracteres prematuramente.
- Tudo o que vem depois se torna SQL executável.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'Contorno da Autenticação
Formulários de login são um alvo prioritário. Ao injetar uma condição sempre verdadeira e comentar o restante, um invasor entra sem uma senha.
A sequência -- comenta a cláusula restante, fazendo com que a verificação da senha seja ignorada.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'Consultas Parametrizadas
A principal defesa são as consultas parametrizadas (instruções preparadas). A estrutura SQL é enviada separadamente dos dados, portanto a entrada é sempre tratada como um valor, nunca como código.
O controlador do banco de dados associa os marcadores ? aos valores fornecidos com segurança.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)Instruções Preparadas em Java
As principais linguagens oferecem parametrização. Em Java, use PreparedStatement em vez de criar cadeias de caracteres com Statement.
Os parâmetros associados não podem sair de seus espaços reservados, portanto a injeção é estruturalmente impossível neste caso.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();Procedimentos Armazenados
Procedimentos armazenados podem ajudar quando usam entradas parametrizadas internamente. Mas tenha cuidado: um procedimento armazenado que cria SQL dinâmico por concatenação é igualmente vulnerável.
- Seguro: parâmetros passados ao procedimento.
- Inseguro:
EXEC()de cadeias de caracteres concatenadas dentro do procedimento.
Validação de Entrada e Listas de Permissões
A validação é uma segunda camada útil. Use listas de permissões (aceite apenas padrões conhecidos como válidos) em vez de listas de bloqueio (tente proibir caracteres inválidos).
Por exemplo, um campo de ID numérico deve rejeitar qualquer coisa que não sejam dígitos antes mesmo de chegar à consulta.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueO Escape É o Último Recurso
Fazer o escape manual das aspas é frágil e propenso a erros. Bancos de dados diferentes têm regras de escape diferentes, e casos extremos (truques de codificação, injeção de segunda ordem) podem passar despercebidos.
Prefira consultas parametrizadas. Use escape somente quando um ORM ou controlador não puder parametrizar um identificador específico.
Menor Privilégio para Contas do Banco de Dados
Limite os danos de qualquer injeção bem-sucedida aplicando o menor privilégio ao usuário do banco de dados do aplicativo.
- Conceda apenas
SELECT,INSERT,UPDATEnas tabelas necessárias. - Nunca use uma conta de superusuário/
rootno aplicativo. - Negue
DROP,FILEe direitos administrativos.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';ORMs e Construtores de Consultas
Os ORMs modernos (Hibernate, Sequelize, Django ORM, SQLAlchemy) usam parametrização por padrão, o que elimina a maior parte do risco de injeção.
O perigo retorna quando os desenvolvedores recorrem ao SQL bruto ou usam interpolação de cadeias de caracteres em um construtor de consultas. Sempre passe os valores como parâmetros associados, mesmo no modo bruto.
Defesa em Profundidade
Nenhum controle isolado é suficiente. Combine camadas:
- Consultas parametrizadas em todos os lugares (principal).
- Validação de entrada/listas de permissões.
- Contas do banco de dados com menor privilégio.
- Um firewall de aplicativos web (WAF) para detectar padrões conhecidos.
- Tratamento de erros que nunca vaze SQL ou rastreamentos de pilha.
Verificação Rápida
Teste sua compreensão da principal defesa.
Recapitulação
Você aprendeu como funciona a injeção de SQL e como impedi-la:
- SQLi surge da concatenação de entradas não confiáveis nas consultas.
- As consultas parametrizadas são a principal defesa.
- Adicione validação por lista de permissões, contas do banco de dados com menor privilégio e um WAF.
- Evite escapes manuais e SQL dinâmico dentro de procedimentos armazenados.
A defesa em profundidade impede que um único erro se transforme em uma violação.
Perguntas Frequentes
A aula “Defesa contra Injeção de SQL” é grátis?
Sim — o texto completo de “Defesa contra Injeção de SQL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Cyber Security Academy, atualize para CoddyKit PRO. O curso de Cyber Security Academy inclui 4 aulas no total.
O que vou aprender em “Defesa contra Injeção de SQL”?
Impeça ataques de injeção Você pratica Cyber Security Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Cyber Security Academy?
Nenhuma experiência prévia é necessária. Cyber Security Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Defesa contra Injeção de SQL”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Cyber Security Academy?
Sim. Cada aula de Cyber Security Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Defesa contra Injeção de SQL
- Controle de Acesso e Criptografia
- Auditoria e Monitoramento
- Segurança de Backup e Recuperação