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

ahs*_*ele 18 security mongoose mongodb node.js express

我正在玩,.

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

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

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

{
  name: 'ahsteele',
  status: 'a'
}
Run Code Online (Sandbox Code Playgroud)

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

pes*_*669 19

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

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

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

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

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


Sam*_*aye 9

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

如果允许用户将$符号附加到您$_GET或其中的字符串或元素的开头,或者$_POST他们将快速使用该符号:http://xkcd.com/327/并且至少可以说,您将成为一个gonner.