FlawOpen

flawopen.com/SQL Injection em JavaScript/TypeORM

O QueryBuilder do TypeORM é seguro contra SQL Injection?

Guia de referência
Resposta curta

Um parâmetro vinculado é como um campo rotulado em um formulário: o TypeORM envia o valor separadamente, mantendo-o como dado, não como instrução SQL. O QueryBuilder vincula parâmetros nomeados quando são fornecidos à parte. Interpolar a entrada na condição a transforma em texto SQL.

INSEGURO — interpolar entrada no SQL
userRepo.createQueryBuilder("u")
  .where(`u.id = ${userId}`)
  .getOne()
PROTEGIDO — vincular o valor separadamente
userRepo.createQueryBuilder("u")
  .where("u.id = :id", { id: userId })
  .getOne()

Vincule valores; limite a estrutura da consulta

QueryBuilder.where() aceita uma condição com placeholders nomeados, como :id, e um objeto de parâmetros separado. Use nomes distintos para valores diferentes; o TypeORM alerta que reutilizar um nome pode sobrescrever seu valor. Não interpole entrada do usuário na condição. Métodos raw, como dataSource.query(), também aceitam placeholders específicos do driver com valores passados separadamente. Parâmetros vinculam dados, não nomes de tabelas ou colunas, ordenação ou SQL arbitrário. Mapeie estruturas selecionáveis para expressões fixas da aplicação.

Como auditar a construção de consultas

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

Perguntas frequentes

Os métodos find do Repository do TypeORM são sempre seguros?

Opções find comuns passam valores pela construção de consultas do TypeORM, mas revise operadores personalizados, expressões SQL raw e strings montadas pela aplicação. Parametrização evita injeção na sintaxe, mas não concede acesso a registros nem valida o significado de um valor.

Referências

Veja também SQL Injection (CWE-89): como funciona e como evitar em todas as linguagens — flawopen.com Django ORM e SQL Injection: padrões seguros Injeção SQL no Doctrine ORM: consultas seguras EF Core FromSqlRaw: SQL parametrizado seguro FastAPI e SQL Injection: o que o Pydantic protege GORM Raw SQL: evite injeção SQL em Go É suficiente escapar aspas contra SQL Injection?