Смягчение атак с использованием MongoDB с помощью Mongoose - PullRequest
0 голосов
/ 08 октября 2018

Я использую оболочку 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 () документация , которая заставляет меня поверить, что я что-то упускаю.

Любое понимание будет оценено.

Другие ссылки:

  1. https://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html
  2. https://ckarande.gitbooks.io/owasp-nodegoat-tutorial/content/tutorial/a1_-_sql_and_nosql_injection.html

1 Ответ

0 голосов
/ 15 октября 2018

Хотя вы можете использовать $eq, чтобы гарантировать, что в запросе используется сравнение на равенство, ваш обработчик экспресс-маршрутов является лучшим местом для проверки формата запроса.

Допустимое значение POST /login должно иметь userName и password строковые поля в теле запроса.Если нет, его следует отклонить еще до того, как он доберется до Мангуста.

...