Держи недоверенные значения отдельно от SQL-текста: parameterized queries / prepared statements на сервере. Никогда не склеивай запрос из данных запроса.
// Опасноconst sql = `SELECT * FROM users WHERE email = '${request.body.email}'`;
// Безопасно: значение отдельно от текстаconst result = await database.query(
"SELECT * FROM users WHERE email = $1",
[request.body.email],
);
Валидация нужна для бизнес-правил, но не заменяет binding. ORM/stored procedure ≠ автоматическая защита. Для идентификаторов (sort column), которые нельзя параметризовать, — фиксированный allowlist.
Итог: параметр = данные, не код. Склейка строк с input — путь к SQLi.
Как предотвратить SQL-инъекции в JavaScript-приложениях? · Sobeso