FlawOpen

flawopen.com/SQL-инъекция в JavaScript/TypeORM

Защищает ли TypeORM QueryBuilder от SQL-инъекций?

Справочное руководство
Краткий ответ

Связанный параметр похож на подписанное поле в форме: TypeORM передаёт значение отдельно, поэтому оно остаётся данными, а не инструкцией SQL. QueryBuilder связывает именованные параметры, переданные отдельно. Интерполяция ввода в условие превращает его обратно в текст SQL.

НЕБЕЗОПАСНО — интерполяция ввода в SQL
userRepo.createQueryBuilder("u")
  .where(`u.id = ${userId}`)
  .getOne()
ЗАЩИЩЕНО — отдельная передача значения
userRepo.createQueryBuilder("u")
  .where("u.id = :id", { id: userId })
  .getOne()

Связывайте значения; ограничивайте структуру запроса

QueryBuilder.where() принимает условие с именованными placeholders, например :id, и отдельный объект параметров. Для разных значений задавайте разные имена: TypeORM предупреждает, что повторное имя перезаписывает значение. Не интерполируйте ввод пользователя в условие. Raw-методы вроде dataSource.query() также поддерживают placeholders драйвера с отдельно переданными значениями. Параметры связывают данные, а не имена таблиц или столбцов, сортировку или произвольный SQL. Сопоставляйте выбираемую структуру с фиксированными выражениями приложения.

Проверка построения запросов TypeORM

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

Вопросы и ответы

Всегда ли безопасны методы find в Repository TypeORM?

Обычные параметры find проходят через построение запросов TypeORM, но проверяйте пользовательские операторы, raw SQL-выражения и строки, сформированные приложением. Параметризация предотвращает внедрение синтаксиса, но не авторизует доступ к записи и не проверяет смысл значения.

Источники

См. также SQL-инъекции (CWE-89): как они работают и как их предотвратить в любом языке — flawopen.com Django ORM и SQL Injection: безопасные шаблоны SQL-инъекция в Doctrine ORM: безопасные запросы EF Core FromSqlRaw: безопасный SQL с параметрами FastAPI и SQL Injection: границы защиты Pydantic GORM Raw SQL: защита от SQL-инъекций в Go Достаточно ли экранировать кавычки от SQL Injection?