flawopen.com/Inyección SQL/Javascript
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.
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.
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.// 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];
}
// 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];
}
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.
mysql2 usa ? mientras que pg usa $1, $2. Usar la sintaxis incorrecta deja la consulta desprotegida o falla.
TypeScript solo valida tipos en tiempo de compilación; en tiempo de ejecución las cadenas llegan tal cual.
grep -rn "query(\`.*\${" --include="*.js" --include="*.ts" .
npx eslint --rule 'no-template-curly-in-string: error' .
p/javascript ruleset in CI to catch unparameterized database queries automatically.Prisma $queryRaw es seguro con plantillas etiquetadas, pero $queryRawUnsafe es vulnerable si interpola variables.