Выбор ответа Middle Безопасность бэкенда обновлено

NoSQL-инъекция в MongoDB

Вопрос

Злоумышленник отправляет {"email": "admin@x.ru", "password": {"$ne": null}}. Что произойдёт и как защититься?

const user = await users.findOne({
  email: req.body.email,
  password: req.body.password,
});

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

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

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

Коротко

Правильный ответ: $ne: null совпадёт с любым паролем; проверять тип полей. Объект из JSON-тела подставляется в фильтр как оператор $ne, и условие «пароль не null» истинно для любой записи.

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

  1. Ничего: MongoDB не исполняет операторы, пришедшие в данных запроса
  2. Найдутся все пользователи, но вход не произойдёт
  3. MongoDB вернёт ошибку синтаксиса фильтра
  4. $ne: null совпадёт с любым паролем; проверять тип полейправильный ответ

Разбор

Объект из JSON-тела подставляется в фильтр как оператор $ne, и условие «пароль не null» истинно для любой записи. Нужна валидация типов на входе (схема, где password строка) и правильная логика: найти пользователя по email и сравнить хеш пароля.

  • Операторы в значениях фильтра MongoDB как раз исполняет.
  • Синтаксической ошибки нет, это валидный фильтр.
  • findOne вернёт одного пользователя, и проверка пройдёт.

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

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

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