Выбор ответа 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» истинно для любой записи.
Варианты ответа
- Ничего: MongoDB не исполняет операторы, пришедшие в данных запроса
- Найдутся все пользователи, но вход не произойдёт
- MongoDB вернёт ошибку синтаксиса фильтра
$ne: nullсовпадёт с любым паролем; проверять тип полейправильный ответ
Разбор
Объект из JSON-тела подставляется в фильтр как оператор $ne, и условие «пароль не null» истинно для любой записи. Нужна валидация типов на входе (схема, где password строка) и правильная логика: найти пользователя по email и сравнить хеш пароля.
- Операторы в значениях фильтра MongoDB как раз исполняет.
- Синтаксической ошибки нет, это валидный фильтр.
findOneвернёт одного пользователя, и проверка пройдёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API