Я использую оболочку Mongoose ODM для NodeJS, и меня беспокоят инъекционные атаки.Предположим, у меня есть следующая схема:
const UserSchema = new mongoose.Schema({ userName: String, password: String });
Если бы я выполнил запрос на вход в систему, который выглядит следующим образом:
router.post('/login', (request, response) => {
const userName = request.body.userName;
const password = request.body.password;
User.findOne({ userName: userName }, function (error, user) {
// ... check password, other logic
});
});
Я был бы открыт для инъекционной атаки с помощьюследующая полезная нагрузка JSON, которая всегда найдет пользователя:
{
"email": { "$gte": "" },
"password": { "$gte": "" }
}
Меня не беспокоит пароль, так как он хэшируется, если найден пользователь, который запрещает вход в систему, но я хочу убедиться, что мой вводдезинфицируется так, что злоумышленник даже не доберется до этой точки.
Мне известно о пакете NPM mongo-sanitize , указанном в аналогичном сообщении StackOverflow который удаляет все ключи JSON, начинающиеся с '$'.В любом случае я планирую использовать это, но никогда не позволю пользователю отправлять необработанный, необработанный JSON.Является ли хорошей практикой в этом случае просто вызывать toString () для userName при условии, что я выполняю правильные проверки null
?
const userName = request.body.userName.toString();
Это исключило бы выполнение запроса, но это не очень безопасно.Я предполагаю, что следующий подход является лучшим подходом, так как он пытается преобразовать userName
в String
:
User.findOne({ userName: { "$eq": userName } }, function (error, user) {
// ... other logic
});
Я не могу найти что-либо относительно этого в Model.findOne () документация , которая заставляет меня поверить, что я что-то упускаю.
Любое понимание будет оценено.
Другие ссылки:
- https://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html
- https://ckarande.gitbooks.io/owasp-nodegoat-tutorial/content/tutorial/a1_-_sql_and_nosql_injection.html