flawopen.com/SQL-инъекция в JavaScript/Sequelize
Защищает ли Sequelize query() от SQL-инъекций?
Параметр похож на запечатанную карточку: SQL получает значение отдельно от инструкций запроса. В Sequelize v6 bind передаёт значения отдельно; replacements экранирует и вставляет их до отправки. Сборка строки из недоверенного ввода обходит оба механизма. Ни один не заменяет имена таблиц и столбцов.
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. Но проверяйте raw SQL, литеральные выражения и строки, собранные приложением. Параметризация не авторизует доступ к записи и не проверяет бизнес-правила.
Источники
- Документация Sequelize v6 — Raw Queries, replacements и bind-параметры
- OWASP — предотвращение SQL-инъекций
- flawopen.com — SQL-инъекция в JavaScript