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.