从URL查询string直接提供的mongo查询有多危险?

我正在玩node.js , express和mongoose 。

为了使事情正常运行,我将Express查询string对象直接传递给了一个mongoose查找函数。 我感到好奇的是这种做法在现场应用程序中有多危险。 我知道一个RDBMS将非常容易被SQL注入。 除了“清理你的投入”的好build议,这个代码有多恶心:

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

这意味着aa获取请求到http://localhost:8080/query?name=ahsteele&status=a只会将以下内容插入到findDocs函数中:

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

这有很多原因会让人觉得不舒服,但这有多危险呢? 将查询parameter passing给mongodb的最佳做法是什么? 快递是否提供任何现成的卫生处理?

就注入问题而言,像SQL一样,风险显着较低…虽然理论上可能通过未知的攻击媒介。

数据结构和协议是二进制和API驱动的,而不是利用域特定语言中的转义值。 基本上,你不能欺骗分析器在最后添加一个“; db.dropCollection()”。

如果它只用于查询,那可能是好的…但是我仍然会提醒你使用一点validation:

  • 确保只有字母数字字符(过滤或无效的空值和其他任何你通常不会接受的)
  • 每个术语强制最大长度(如255个字符)
  • 强制整个查询的最大长度
  • 删除以“$”开头的特殊参数名称,如“$ where”等
  • 不要允许嵌套的数组/文件/散列…只有string和整数

另外请记住,一个空的查询返回一切。 您可能需要对该返回值进行限制。 🙂

操作符注入在这里是一个严重的问题,我会build议你至less编码/转义某些字符,更具体的$符号: http : //docs.mongodb.org/manual/faq/developers/#dollar-sign-operator-escaping

如果允许用户在$_GET$_POST内的string或元素的开头追加一个$符号,或者他们会很快用它来: http ://xkcd.com/327/,至less可以说。

据我所知快递并没有提供任何消毒箱控制卫生。 要么你可以编写你自己的中间件,我们可以用你自己的逻辑做一些基本的检查。正如你所说的,你提到的情况有点危险。

但是为了方便使用,Mongoose模型中内置的所需types至less可以为您提供默认的清理和对进入或未进入的内容的一些控制。

比如像这样的东西

 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