🚀 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; --

  1. O que o ponto e vírgula ; faz na linguagem SQL?
  2. 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.

  1. 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)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 06 Seguranca) e clique em Commit to main.
  2. 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:

  1. O ; serve para encerrar o comando atual e iniciar um novo comando na mesma linha.
  2. 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!

Capitulo Anterior | Proximo Capitulo