Выбор ответа Junior Безопасность бэкенда спрашивают часто обновлено
Как исправить SQL-инъекцию
Вопрос
Как правильно исправить этот запрос?
const rows = await db.query(
`SELECT * FROM orders WHERE user_id = '${req.query.userId}'`
);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Параметризованный запрос: WHERE userid = $1 и массив значений. При параметризации текст запроса и значения уходят в базу раздельно, значение никогда не интерпретируется как SQL. - Ручная чистка кавычек ненадёжна: есть обходы через кодировки, числовые контексты и комментарии. - try/catch не мешает…
Варианты ответа
- Удалить из
userIdвсе кавычки черезreplaceперед сборкой запроса - Параметризованный запрос:
WHERE user_id = $1и массив значенийправильный ответ - Обернуть запрос в
try/catchи логировать ошибки - Закодировать
userIdчерезencodeURIComponent
Разбор
При параметризации текст запроса и значения уходят в базу раздельно, значение никогда не интерпретируется как SQL.
- Ручная чистка кавычек ненадёжна: есть обходы через кодировки, числовые контексты и комментарии.
try/catchне мешает выполнить вредный запрос.encodeURIComponentпредназначен для URL и не экранирует SQL как надо.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API