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

标签 node.js mongodb express mongoose security

我在玩 , , 和 .

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

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 的最佳实践是什么? express 是否提供任何开箱即用的 sanitizer ?

最佳答案

就注入(inject)问题而言,就像使用 SQL 一样,风险要低得多……尽管理论上可以通过未知的攻击向量来实现。

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

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

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

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

关于node.js - 直接从 URL 查询字符串提供的 mongo 查询有多危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15917400/

相关文章:

javascript - 在不同的子域上使用 Socket.IO 服务器和客户端

javascript - 由于性能开销而替换 Nodejs 中的 try/catch

typescript - 如何在树形结构上列出 MongoDB 中的所有项目?

java - 使用java和mongodb api从mongodb检索数组

javascript - 如何确认是否为 ReactJS + NodeJS Express 的 MongoDB 创建了数据库?

javascript - Ajax DELETE 请求似乎仅删除列表中的第一项

javascript - 消除 "X-Powered-By" header 是否会自动从 HTTP 响应中消除 "Server" header

javascript - 查询对象数组以检查它是否包含 mongoose 中的字符串数组

c# - C# 中的 Windows 服务无法启动

node.js - 有没有办法阻止express渲染静态目录中的文件?