flawopen.com/SQL Injection en JavaScript/TypeORM
¿El QueryBuilder de TypeORM es seguro frente a SQL Injection?
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.
userRepo.createQueryBuilder("u")
.where(`u.id = ${userId}`)
.getOne()
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
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
- Documentación TypeORM — consultas raw de DataSource y parámetros
- OWASP — Prevención de SQL Injection
- Documentación TypeORM — QueryBuilder de selección y parámetros
- flawopen.com — SQL Injection en JavaScript