flawopen.com/SQL-инъекция в JavaScript/TypeORM
Защищает ли TypeORM QueryBuilder от SQL-инъекций?
Связанный параметр похож на подписанное поле в форме: TypeORM передаёт значение отдельно, поэтому оно остаётся данными, а не инструкцией SQL. QueryBuilder связывает именованные параметры, переданные отдельно. Интерполяция ввода в условие превращает его обратно в текст 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 проходят через построение запросов TypeORM, но проверяйте пользовательские операторы, raw SQL-выражения и строки, сформированные приложением. Параметризация предотвращает внедрение синтаксиса, но не авторизует доступ к записи и не проверяет смысл значения.
Источники
- Документация TypeORM — raw-запросы DataSource и параметры
- OWASP — предотвращение SQL-инъекций
- Документация TypeORM — Select QueryBuilder и параметры
- flawopen.com — SQL-инъекция в JavaScript