【问题标题】:How dangerous is a mongo query which is fed directly from a URL query string?直接从 URL 查询字符串提供的 mongo 查询有多危险?
【发布时间】:2013-04-01 19:05:48
【问题描述】:

我在玩

为了立即启动和运行,我将 Express 查询字符串对象直接传递给 mongoose 查找函数。我很好奇的是,这种做法在实时应用程序中会有多危险。我知道 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 的最佳实践是什么? express 是否提供任何开箱即用的消毒?

【问题讨论】:

  • 听说过操作员注射吗?从而有人可以在 url 中形成一个查询,该查询可以从数据中收集数据,就像 bobby 表示例一样?
  • 一旦您接受仍然需要执行的清理,我还要补充一点,您认为如果不使用索引等,查询可能会导致您的系统出现大量不必要的抖动。

标签: node.js express mongoose node.js mongodb express mongoose security


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    如果允许用户将$ 符号附加到$_GET$_POST 中的字符串或元素的开头,或者他们将快速使用它的任何内容:http://xkcd.com/327/,那么您将是一个笨蛋,至少可以这么说。

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        相关资源
        最近更新 更多