flawopen.com/SQL Injection en JavaScript/Sequelize
¿Sequelize query() es seguro frente a SQL Injection?
Un parámetro es como una ficha de valor sellada: SQL recibe el valor por separado de las instrucciones. En Sequelize v6, bind envía los valores aparte; replacements los escapa e inserta antes del envío. Construir la cadena con entrada no confiable evita ambos mecanismos. Ninguno sustituye nombres de tablas o columnas.
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
Mantén los valores fuera de la sintaxis SQL
En Sequelize v6, Sequelize escapa e inserta replacements antes de enviar la consulta a la base; bind envía los valores separados del texto SQL. Ambos evitan concatenar valores del usuario, pero la sintaxis depende del método y del dialecto. Los parámetros no representan nombres de tablas o columnas, orden ni fragmentos SQL. Asigna la estructura seleccionable a una allowlist fija de la aplicación. Los métodos de modelo pueden parametrizar valores estructurados habituales, pero el SQL raw y las expresiones literales también requieren revisión.
Cómo auditar consultas Sequelize
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .Preguntas frecuentes
Los valores estructurados habituales se procesan mediante la construcción de consultas de Sequelize. Aun así, revisa SQL raw, expresiones literales y cadenas montadas por la aplicación. Parametrizar no autoriza registros ni valida reglas de negocio.
Referencias
- Documentación Sequelize v6 — Raw Queries, replacements y parámetros bind
- OWASP — Prevención de SQL Injection
- flawopen.com — SQL Injection en JavaScript