直接从URL查询字符串提供的mongo查询有多危险?

时间:2013-04-10 05:09:21

标签: node.js mongodb express mongoose security

我正在玩

为了立即启动并运行,我将Express查询字符串对象直接传递给mongoose find函数。我很好奇的是这种做法在现场应用程序中有多危险。我知道RDBMS极易受到SQL注入攻击。除了“清理你的输入”的好建议之外,这段代码是多么邪恶:

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

意味着对http://localhost:8080/query?name=ahsteele&status=a的get请求只会将以下内容推送到findDocs函数中:

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

由于很多原因,这种感觉很糟糕,但它有多安全?将查询参数传递给mongodb的最佳做法是什么?快递是否提供开箱即用的消毒?

3 个答案:

答案 0 :(得分:19)

就注射问题而言,与SQL一样,风险显着降低......虽然理论上可能通过未知的攻击向量。

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

如果它仅用于查询,它可能很好......但我仍然提醒您使用一点点验证:

  • 确保只使用字母数字字符(过滤或使空值无效以及您通常不会接受的任何其他内容)
  • 每个字词强制执行最大长度(例如255个字符)
  • 强制执行整个查询的最大长度
  • 以“$”开头的特殊参数名称,例如“$ where”&这样
  • 不允许嵌套数组/文档/哈希...只有字符串&整数

另外,请记住,空查询会返回所有内容。您可能希望限制该返回值。 :)

答案 1 :(得分:9)

操作员注入是一个严重的问题,我建议您至少编码/转义某些字符,更具体地说是$符号:http://docs.mongodb.org/manual/faq/developers/#dollar-sign-operator-escaping

如果允许用户将$符号附加到$_GET$_POST中的字符串或元素的开头,或者他们将快速将其用于:{{3}至少可以说,你将是一个好主意。

答案 2 :(得分:3)

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

但是为了便于使用,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