FlawOpen

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

Защищает ли Sequelize query() от SQL-инъекций?

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

Параметр похож на запечатанную карточку: SQL получает значение отдельно от инструкций запроса. В Sequelize v6 bind передаёт значения отдельно; replacements экранирует и вставляет их до отправки. Сборка строки из недоверенного ввода обходит оба механизма. Ни один не заменяет имена таблиц и столбцов.

НЕБЕЗОПАСНО — конкатенация ввода в SQL
sequelize.query(
  `SELECT * FROM users WHERE id = ${userId}`
)
ЗАЩИЩЕНО — отдельная передача значения
sequelize.query(
  "SELECT id FROM users WHERE id = $id",
  { bind: { id: userId },
    type: QueryTypes.SELECT }
)

Не смешивайте значения с синтаксисом SQL

В Sequelize v6 replacements экранируются и вставляются Sequelize до отправки запроса в базу; bind передаёт значения отдельно от текста SQL. Оба способа не дают конкатенировать пользовательские значения, но синтаксис зависит от метода и диалекта. Параметры не предназначены для имён таблиц и столбцов, сортировки или фрагментов SQL. Сопоставляйте выбираемую структуру с фиксированным allowlist приложения. Методы модели параметризуют обычные структурированные значения, однако raw SQL и литеральные выражения тоже нужно проверять.

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

rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .

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

Всегда ли методы модели Sequelize безопасны от SQL-инъекций?

Обычные структурированные значения обрабатываются построением запросов Sequelize. Но проверяйте raw SQL, литеральные выражения и строки, собранные приложением. Параметризация не авторизует доступ к записи и не проверяет бизнес-правила.

Источники

См. также SQL-инъекции (CWE-89): как они работают и как их предотвратить в любом языке — flawopen.com Защищает ли SQLAlchemy text() от SQL-инъекций? Предотвращает ли проверка sqlx при компиляции SQL-инъекции? Защищают ли хранимые процедуры от SQL-инъекций? Защищает ли TypeORM QueryBuilder от SQL-инъекций? Django ORM и SQL Injection: безопасные шаблоны SQL-инъекция в Doctrine ORM: безопасные запросы