FlawOpen

flawopen.com/SQL Injection en JavaScript/Sequelize

¿Sequelize query() es seguro frente a SQL Injection?

Guía de referencia
Respuesta breve

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.

INSEGURO — concatenar la entrada en SQL
sequelize.query(
  `SELECT * FROM users WHERE id = ${userId}`
)
PROTEGIDO — enlazar el valor por separado
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 métodos de modelo de Sequelize siempre son seguros frente a SQL Injection?

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

Véase también Inyección SQL (CWE-89): cómo funciona y cómo evitarla en cada lenguaje — flawopen.com ¿SQLAlchemy text() es seguro frente a SQL Injection? ¿La verificación de consultas de sqlx en compilación evita la inyección SQL? ¿Los procedimientos almacenados evitan la inyección SQL? ¿El QueryBuilder de TypeORM es seguro frente a SQL Injection? Django ORM y SQL Injection: patrones seguros Inyección SQL en Doctrine ORM: consultas seguras