flawopen.com/Injeção de SQL/Javascript

Injeção de SQL in Javascript

Crítica CWE-89 Draft — pending review
Language: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia
Explicação simples (ELI5)

Imagine um guichê que só espera um número de protocolo. A injeção de SQL acontece quando alguém digita uma frase mágica que faz o sistema revelar todos os protocolos salvos.

Termos-chave nesta página
Template literal
Interpolação com crases (`...`). Em comandos SQL, tem o mesmo efeito perigoso da concatenação manual.

O que está acontecendo

A injeção de SQL ocorre quando dados controlados pelo usuário são inseridos diretamente no texto da consulta ao banco de dados.

Impacto no mundo real

Em 2015, a TalkTalk teve mais de 150 mil contas expostas devido a uma injeção de SQL básica, recebendo multa de 400 mil libras.

Fonte: UK Information Commissioner's Office, 2016.

Vulnerável vs. corrigido

VULNERABLE
// userId comes straight from request query
async function getUser(pool, userId) {
  const query = `SELECT * FROM users
    WHERE id = ${userId}`;
  const [rows] = await pool.query(query);
  return rows[0];
}
FIXED
// value is passed separately, never inlined
async function getUser(pool, userId) {
  const [rows] = await pool.query(
    'SELECT * FROM users WHERE id = ?',
    [userId]
  );
  return rows[0];
}

Por que a correção funciona

A versão segura separa a query dos valores, garantindo que os dados nunca sejam executados como código SQL.

Armadilhas específicas da linguagem

Sintaxe difere por driver

mysql2 usa ? enquanto pg (PostgreSQL) usa $1, $2.

Mitos comuns

"TypeScript protege contra injeção"

TypeScript apenas checa tipos em compilação; não altera a forma como a consulta é executada no banco.

Como verificar se você foi afetado

grep -rn "query(\`.*\${" --include="*.js" --include="*.ts" . npx eslint --rule 'no-template-curly-in-string: error' .
Run Semgrep with p/javascript ruleset in CI to catch unparameterized database queries automatically.

Lista de verificação de prevenção

Perguntas frequentes

ORMs protegem sempre?

Apenas nos métodos padrão. Em consultas brutas (raw), é obrigatório parametrizar manualmente.

Referências

Veja também: Cross-Site Scripting Command InjectionPath Traversal