flawopen.com/Inyección SQL/Javascript

Inyección SQL in Javascript

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

Imagine un formulario que espera un número de ticket. La inyección SQL ocurre cuando alguien escribe un comando malicioso que engaña a la base de datos para mostrar todos los datos porque nunca se validó la entrada.

Términos clave en esta página
Plantilla literal
Cadenas con comillas invertidas (`...`) que interpolan variables. En SQL funcionan igual que la concatenación insegura.
Parámetro posicional
Marcadores como ? o $1 que separan los datos de la instrucción SQL.

Qué está pasando

La inyección SQL ocurre cuando la entrada del usuario se concatena directamente en la consulta. En Node.js, las plantillas literales (`${val}`) son la causa más frecuente.

Impacto en el mundo real

En 2015, TalkTalk sufrió una brecha de más de 150.000 clientes debido a inyección SQL, recibiendo una multa récord de £400.000.

Fuente: UK Information Commissioner's Office, 2016.

Vulnerable vs. corregido

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 qué funciona la solución

La versión corregida envía la estructura de la consulta y los datos por separado. La base de datos nunca interpreta los datos como sintaxis ejecutable.

Puntos críticos específicos

Diferencias entre controladores

mysql2 usa ? mientras que pg usa $1, $2. Usar la sintaxis incorrecta deja la consulta desprotegida o falla.

Conceptos errneos comunes

"El tipado en TypeScript evita inyecciones"

TypeScript solo valida tipos en tiempo de compilación; en tiempo de ejecución las cadenas llegan tal cual.

Cómo comprobar si está afectado

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 comprobación de prevención

Preguntas frecuentes

¿Es seguro Prisma?

Prisma $queryRaw es seguro con plantillas etiquetadas, pero $queryRawUnsafe es vulnerable si interpola variables.

Referencias

Ver también: Cross-Site Scripting Command InjectionPath Traversal