Выбор ответа Junior Безопасность бэкенда спрашивают часто обновлено

Как исправить SQL-инъекцию

Вопрос

Как правильно исправить этот запрос?

const rows = await db.query(
  `SELECT * FROM orders WHERE user_id = '${req.query.userId}'`
);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Параметризованный запрос: WHERE userid = $1 и массив значений. При параметризации текст запроса и значения уходят в базу раздельно, значение никогда не интерпретируется как SQL. - Ручная чистка кавычек ненадёжна: есть обходы через кодировки, числовые контексты и комментарии. - try/catch не мешает…

Варианты ответа

  1. Удалить из userId все кавычки через replace перед сборкой запроса
  2. Параметризованный запрос: WHERE user_id = $1 и массив значенийправильный ответ
  3. Обернуть запрос в try/catch и логировать ошибки
  4. Закодировать userId через encodeURIComponent

Разбор

При параметризации текст запроса и значения уходят в базу раздельно, значение никогда не интерпретируется как SQL.

  • Ручная чистка кавычек ненадёжна: есть обходы через кодировки, числовые контексты и комментарии.
  • try/catch не мешает выполнить вредный запрос.
  • encodeURIComponent предназначен для URL и не экранирует SQL как надо.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме