JavaScript NoSQL Предотвращение инъекций в MongoDB

Как я могу предотвратить инъекции 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
}