← Guias
4 min de leitura

SQL injection: por que concatenar o que o usuário digita ainda derruba sistemas

Montar a consulta SQL juntando texto do usuário permite ler ou apagar o banco inteiro. A correção é simples: parâmetros. Exemplos para Node, Python e PHP.

A falha é antiga e continua aparecendo, inclusive em código gerado por IA: a consulta é montada juntando o texto que veio do usuário. Esse texto pode trazer comandos SQL — e o banco executa.

// ❌ o que o usuário digitar vira parte do comando
const cliente = req.query.cliente;
await banco.query("select * from agendamentos where cliente_id = '" + cliente + "'");

A correção: parâmetros

Com parâmetros, o valor é enviado separado do comando. O banco nunca o interpreta como SQL, digite a pessoa o que digitar.

// ✅ Node (pg)
await banco.query("select * from agendamentos where cliente_id = $1", [req.query.cliente]);
# ✅ Python (psycopg)
cur.execute("select * from agendamentos where cliente_id = %s", (cliente,))
// ✅ PHP (PDO)
$stmt = $pdo->prepare('select * from agendamentos where cliente_id = ?');
$stmt->execute([$_GET['cliente']]);
  • ORMs e query builders (Prisma, Drizzle, o cliente do Supabase) já usam parâmetros — desde que você não use as funções de SQL cru com texto concatenado.
  • Template string também é concatenação: montar a consulta com ${id} no meio do texto tem o mesmo problema.
  • Escapar à mão não é solução: parâmetro é.

Dicas curtas de segurança para quem cria com IA: siga @npx_vibedefender no Instagram.