🚀 Capítulo 06: SQL Injection (Injeção de SQL) (Tema: Inception / A Origem)
NOTE
Este capítulo utiliza a temática de Inception para explicar o SQL Injection. Plantar um comando disfarçado no banco de dados faz o sistema executar a sua vontade sem perceber!
1. 🎯 Objetivo da Aula
Compreender como funciona o ataque de SQL Injection (SQLi), entender os riscos para o banco de dados e aprender a se proteger usando Consultas Preparadas (Prepared Statements).
2. 🏢 O Cenário Prático (Seu Desafio)
No filme Inception (A Origem), a equipe de Dom Cobb invade o sonho de uma pessoa para plantar uma ideia lá no fundo do subconsciente. A pessoa acorda achando que aquela ideia foi dela mesma!
- No SQL Injection, o hacker faz exatamente isso com o seu Banco de Dados.
- Ele digita um comando SQL no campo de formulário (como a barra de busca).
- O seu código (ingênuo) junta esse texto na consulta e envia para o banco.
- O banco de dados “sonha” (executa) o comando achando que ele faz parte do sistema legítimo!
Seu desafio é impedir que ideias alienígenas (comandos maliciosos) sejam plantadas no subconsciente do seu sistema!
3. 🧠 Fundamentos: A Teoria Traduzida
O SQL Injection ocorre quando dados fornecidos pelo usuário são inseridos diretamente em uma consulta SQL sem nenhuma verificação ou limpeza.
🔓 O Ataque do ' OR 1=1 --
Imagine que o sistema faz a seguinte consulta para buscar um produto pelo nome:
SELECT * FROM produtos WHERE nome = '$buscaDoUsuario';Se o usuário digitar apenas Cadeira, a consulta fica segura.
Mas e se ele digitar: ' OR 1=1 --?
A consulta executada pelo banco será:
SELECT * FROM produtos WHERE nome = '' OR 1=1 --';- Como
1=1é sempre verdadeiro, o banco trará todos os produtos da tabela, ignorando o nome! - Os tracinhos
--servem para comentar o resto da linha, anulando as aspas que o programador colocou.
4. 📖 Exemplo Guiado: O Jeito Certo (Prepared Statements)
Para evitar que o usuário plante comandos no seu banco, nós usamos Prepared Statements (Consultas Preparadas). Em vez de juntar textos, nós usamos “buracos” (placeholders) que o próprio banco preenche com segurança.
Código Vulnerável (Ruim):
// Juntando textos (perigoso!)
let query = "SELECT * FROM usuarios WHERE login = '" + usuario + "'";Código Seguro (Bom):
// Usando placeholders (?)
let query = "SELECT * FROM usuarios WHERE login = ?";
conexao.execute(query, [usuario]); // O banco sabe que o conteúdo de 'usuario' é apenas um texto, e não um comando!🛠️ Prática Obrigatória 1: O Ataque da Exclusão
Imagine que um hacker quer apagar a tabela de usuários usando SQL Injection. Ele digita o seguinte no campo de busca do site:
' ; DROP TABLE usuarios; --
- O que o ponto e vírgula
;faz na linguagem SQL? - Como ficaria a consulta final que o banco de dados executaria se o código do programador fosse vulnerável?
6. 🛠️ Prática Obrigatória 2: ORM como Defesa
Muitos programadores modernos usam ferramentas chamadas ORMs (como Hibernate em Java, Entity Framework em C# ou Sequelize em Node.js) para não precisarem escrever código SQL manualmente.
- Pesquise se o uso de ORMs protege automaticamente contra SQL Injection ou se ainda é preciso ter cuidado.
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 06 Seguranca) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_12_desenvolvimento_seguro/
├── capitulos/
│ ├── capitulo_06_sql_injection.md
│ └── codigos/
│ └── cap06/
│ └── sqli_vulneravel.js💡 Checkpoint de Lógica
Nunca confie nos dados que vêm do usuário! Mesmo que o campo seja para digitar um número, o usuário pode digitar um texto com comandos SQL. Valide e limpe tudo!
10. 🔥 Desafio de Fixação
Pesquise sobre a famosa tirinha do “Little Bobby Tables” do site xkcd, que faz uma piada clássica sobre SQL Injection.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
- O
;serve para encerrar o comando atual e iniciar um novo comando na mesma linha. - A consulta ficaria:
SELECT * FROM produtos WHERE nome = '' ; DROP TABLE usuarios; --';. O banco buscaria os produtos e logo em seguida apagaria a tabela de usuários!