Насколько опасен запрос mongo, который подается напрямую из строки запроса URL?

Я играю с , и .

Чтобы получить что-то и запустить прямо сейчас, я передаю строковый объект Express query непосредственно в функцию поиска мангуста. Мне любопытно, насколько опасна эта практика в реальном приложении. Я знаю, что СУБД будет чрезвычайно уязвим для SQL-инъекций. Помимо хорошего совета "дезинформировать ваши материалы", как зло является этим кодом:

app.get('/query', function (req, res) {
    models.findDocs(req.query, function (err, docs) {
            res.send(docs);
        });
});

Предполагая, что запрос a get для http://localhost:8080/query?name=ahsteele&status=a просто запустит следующее в функцию findDocs:

{
  name: 'ahsteele',
  status: 'a'
}

Это неприятно по многим причинам, но насколько опасно это? Какая наилучшая практика для передачи параметров запроса в mongodb? Является ли экспресс какой-либо из дезактивации коробки?

Ответы

Ответ 1

Что касается проблемы с инъекцией, как и с SQL, риск значительно ниже... хотя и теоретически возможен через неизвестный вектор атаки.

Структуры данных и протокол основаны на двоичном и управляемом API, а не на использовании экранированных значений на языке, специфичном для домена. В принципе, вы не можете просто обмануть синтаксический анализатор, добавив в конце команду "; db.dropCollection()".

Если он используется только для запросов, это, вероятно, прекрасно... но я все же предостерег бы вас от использования крошечной части проверки:

  • Обеспечьте только буквенно-цифровые символы (отфильтруйте или аннулируйте нули и все, что вы обычно не принимаете)
  • Обеспечить максимальную длину (например, 255 символов) на срок
  • Обеспечить максимальную длину всего запроса
  • Разделите специальные имена параметров, начинающиеся с "$", например "$ where" и такие
  • Не разрешать вложенные массивы/документы/хеши... только строки и ints

Кроме того, имейте в виду, что пустой запрос возвращает все. Возможно, вам понадобится ограничение на это возвращаемое значение.:)

Ответ 2

Включение оператора является серьезной проблемой здесь, и я бы рекомендовал вам, по крайней мере, кодировать/удалять определенные символы, более конкретно символ $: http://docs.mongodb.org/manual/faq/developers/#dollar-sign-operator-escaping

Если пользователю разрешено добавлять символ $ в начало строк или элементов в ваших $_GET или $_POST или что бы они не использовали, они быстро: http://xkcd.com/327/, и вы, скорее всего, будете gonner.

Ответ 3

Насколько я знаю, Express не предоставляет никакого контроля над коробкой для санитарии. Либо вы можете написать свое собственное Middleware, что мы делаем некоторые базовые проверки в вашей собственной логике. И, как вы сказали, случай, который вы упомянули, немного рискован.

Но для удобства использования требуемые типы, встроенные в модели Mongoose, по крайней мере дают вам дезинфекцию по умолчанию и некоторый контроль над тем, что попадает или нет.

Например, что-то вроде этого

var Person = new Schema({
  title   : { type: String, required: true }
, age     : { type: Number, min: 5, max: 20 }
, meta    : {
      likes : [String]
    , birth : { type: Date, default: Date.now }
  }

});

Проверьте это для получения дополнительной информации.

http://mongoosejs.com/docs/2.7.x/docs/model-definition.html