Насколько опасен запрос mongo, который подается напрямую из строки запроса URL?
Я играю с node.js, express и mongoose.
Чтобы получить что-то и запустить прямо сейчас, я передаю строковый объект 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