FlawOpen

flawopen.com/SQL Injection en JavaScript/TypeORM

¿El QueryBuilder de TypeORM es seguro frente a SQL Injection?

Guía de referencia
Respuesta breve

Un parámetro enlazado es como un campo etiquetado de un formulario: TypeORM envía el valor aparte para que siga siendo dato y no una instrucción SQL. QueryBuilder enlaza los parámetros con nombre que se pasan por separado. Interpolar una entrada en la condición la convierte de nuevo en texto SQL.

INSEGURO — interpolar la entrada en SQL
userRepo.createQueryBuilder("u")
  .where(`u.id = ${userId}`)
  .getOne()
PROTEGIDO — enlazar el valor por separado
userRepo.createQueryBuilder("u")
  .where("u.id = :id", { id: userId })
  .getOne()

Enlaza valores; limita la estructura de la consulta

QueryBuilder.where() acepta una condición con placeholders con nombre, como :id, y un objeto de parámetros separado. Usa nombres distintos para valores distintos; TypeORM advierte que reutilizar un nombre puede sobrescribir su valor. No interpolas la entrada del usuario en la condición. Los métodos raw, como dataSource.query(), también admiten placeholders específicos del driver con valores separados. Los parámetros enlazan datos, no nombres de tablas o columnas, orden ni SQL arbitrario. Asigna la estructura seleccionable a expresiones fijas de la aplicación.

Cómo auditar la construcción de consultas

rg -n '(\.where\(|\.query\(|\.sql)' --glob '*.ts' .

Preguntas frecuentes

¿Los métodos find de Repository de TypeORM son siempre seguros?

Las opciones find habituales pasan valores por la construcción de consultas de TypeORM, pero revisa operadores personalizados, expresiones SQL raw y cadenas montadas por la aplicación. Parametrizar evita inyección de sintaxis, pero no autoriza registros ni valida el significado de un valor.

Referencias

Véase también Inyección SQL (CWE-89): cómo funciona y cómo evitarla en cada lenguaje — flawopen.com Django ORM y SQL Injection: patrones seguros Inyección SQL en Doctrine ORM: consultas seguras EF Core FromSqlRaw: SQL parametrizado seguro FastAPI y SQL Injection: qué protege Pydantic GORM Raw SQL: evita la inyección SQL en Go ¿Basta escapar comillas para evitar SQL Injection?