Проверяет умение безопасно передавать параметры HTTP-запроса в запросы Sequelize, чтобы избежать SQL-инъекций и корректно фильтровать данные.
Sequelize — это ORM для Node.js, которая превращает JavaScript-объекты в SQL-запросы. Когда приходит HTTP-запрос, его параметры лежат в req.query (строка запроса), req.params (параметры маршрута) и req.body (тело). Задача — передать их в методы модели так, чтобы Sequelize построил безопасный SQL.
Большинство параметров используются для фильтрации. Их передают в опцию where метода findAll, findOne, update и т.д. Sequelize сам подставит значения как bind-параметры, если использовать операторы из Op.
const { Op } = require('sequelize');
// GET /users?name=Alice&age=30
app.get('/users', async (req, res) => {
const { name, age } = req.query;
const where = {};
if (name) where.name = { [Op.like]: `%${name}%` };
if (age) where.age = { [Op.gte]: Number(age) };
const users = await User.findAll({ where });
res.json(users);
});Параметры из req.params обычно идут в where по первичному ключу, а limit и offset — отдельные опции. Их обязательно приводить к числу.
// GET /users/42?limit=10&offset=20
app.get('/users/:id', async (req, res) => {
const user = await User.findByPk(Number(req.params.id));
res.json(user);
});
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 20;
const users = await User.findAll({
limit,
offset: (page - 1) * limit,
});Для OR-условий, диапазонов и сортировки используют Op.or, Op.between и опцию order. Значения из запроса нужно валидировать по белому списку, чтобы нельзя было сортировать по произвольным полям.
const allowedSort = ['name', 'createdAt'];
const sort = allowedSort.includes(req.query.sort) ? req.query.sort : 'id';
const users = await User.findAll({
where: {
[Op.or]: [
{ name: { [Op.like]: `%${req.query.q}%` } },
{ email: { [Op.like]: `%${req.query.q}%` } },
],
},
order: [[sort, 'ASC']],
});req.query целиком в where — злоумышленник может передать операторы или поля, которых нет в модели.sequelize.query с конкатенацией строк — только replacements или bind.Number(), булевы через явное сравнение.Итог: параметры HTTP-запроса передаются в Sequelize через объект where и опции limit, offset, order, при этом значения нужно валидировать и приводить к нужным типам. Такой подход даёт безопасные параметризованные запросы и защищает приложение от SQL-инъекций.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию