一尘不染

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

node.js

我在玩node.jsexpressmongoose

为了立即启动并运行,我将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只会将以下内容推送到findDocs函数中:

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

由于种种原因,这感觉很不好,但是它有多不安全?将查询参数传递给mongodb的最佳实践是什么?快递提供开箱即用的消毒服务吗?


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

就注入问题而言,就像SQL一样,风险明显更低……尽管理论上可以通过未知的攻击媒介来实现。

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

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

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

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

2020-07-07