Как я могу предотвратить инъекции JavaScript NoSQL в MongoDB?
Я работаю над приложением Node.js, и я передаю req.body
, который является объектом json, в функцию сохранения модели mongoose. Я думал, что есть гарантии за кулисами, но это, похоже, не так.
Ответ 1
Примечание. Мой ответ неверный. Пожалуйста, обратитесь к другим ответам.
-
Когда клиентская программа собирает запрос в MongoDB, она создает объект BSON, а не строку. Таким образом, традиционные атаки SQL-инъекций не являются проблемой.
За подробностями следуйте документации
ОБНОВИТЬ
Избегайте выражений типа eval
которые могут выполнять произвольные JS. Если вы принимаете ввод от пользователя и запускаете eval
как выражения без очистки ввода, вы можете испортить. Как указывает JoBu1324, такие операции, как where
, mapReduce
и group
позволяют напрямую выполнять выражения JS.
Ответ 2
Ответ Sushant неверен. Вам нужно знать о вводе NoSQL в MongoDB. p >
Пример (взято из здесь)
User.findOne({
"name" : req.params.name,
"password" : req.params.password
}, callback);
Если req.params.password
- { $ne: 1 }
, пользователь будет извлечен без знания пароля ($ne
означает, что оно равно 1).
Драйвер MongoDB
Вы можете использовать mongo-sanitize:
Он вычеркнет любые клавиши, начинающиеся с "$" на входе, так что вы может передать его MongoDB, не беспокоясь о злонамеренных пользователях перезапись.
var sanitize = require('mongo-sanitize');
var name = sanitize(req.params.name);
var password = sanitize(req.params.password);
User.findOne({
"name" : name,
"password" : password
}, callback);
Драйвер Mongoose
Как следует из схемы, если пароль является строковым полем, он преобразует объект { $ne: 1 }
в строку и никакого ущерба не будет. В этом случае вам не нужно санировать, просто не забудьте установить правильную схему.
Ответ 3
Хотя сообщение устарело, я отвечаю.
Я знаю три способа.
Сначала: Существует многоцелевое content-filter. Также обеспечивает защиту от инъекций MongoDB путем фильтрации.
Второй: mongo-sanitize, Помощник для дезинфекции запросов mongodb против инъекций селектора запросов.
Третий: Я видел здесь это решение, которое может быть применено и для MongoDB. Это очень просто реализовать. Используйте только встроенную функцию escape()
JavaScript.
escape()
преобразует строку в код ascii
. $ne
преобразуется в %24ne
.
var privateKey = escape(req.params.privateKey);
App.findOne({ key: privateKey }, function (err, app) {
//do something here
}