Node.js 直接从URL查询字符串输入的mongo查询有多危险?

Node.js 直接从URL查询字符串输入的mongo查询有多危险?,node.js,express,mongoose,mongodb,security,Node.js,Express,Mongoose,Mongodb,Security,我在和你玩,还有 为了立即启动并运行一些东西,我将直接将Express查询字符串对象传递给mongoosefind函数。我想知道的是,在一个实时应用程序中,这种做法有多危险。我知道RDBMS极易受到SQL注入的影响。除了“净化你的输入”这句好话之外,这段代码有多邪恶: app.get('/query',函数(req,res){ 模型。findDocs(请求查询、函数(错误、文档){ res.send(文档); }); }); 这意味着一个get请求要http://localhost:8080/

我在和你玩,还有

为了立即启动并运行一些东西,我将直接将Express查询字符串对象传递给mongoosefind函数。我想知道的是,在一个实时应用程序中,这种做法有多危险。我知道RDBMS极易受到SQL注入的影响。除了“净化你的输入”这句好话之外,这段代码有多邪恶:

app.get('/query',函数(req,res){
模型。findDocs(请求查询、函数(错误、文档){
res.send(文档);
});
});
这意味着一个get请求要
http://localhost:8080/query?name=ahsteele&status=a
只需将以下内容插入findDocs函数:

{
姓名:“阿斯蒂尔”,
状态:“a”
}

出于很多原因,这让人觉得恶心,但它有多不安全呢?向mongodb传递查询参数的最佳实践是什么?express是否提供任何开箱即用的消毒处理?

据我所知,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 }
  }
}))

更多信息也请查看此


就注入问题而言,就像SQL一样,风险大大降低。。。虽然理论上可能通过未知的攻击向量。 数据结构和协议是二进制和API驱动的,而不是在特定于域的语言中利用转义值。基本上,您不能欺骗解析器在最后添加一个“db.dropCollection()”

如果它只用于查询,它可能很好。。。但我还是要提醒你使用一点验证:

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

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

运算符注入在这里是一个严重的问题,我建议您至少对某些字符进行编码/转义,更具体地说是
$
符号:


如果允许用户将
$
符号附加到
$\u GET
$\u POST
中的字符串或元素的开头,或者其他任何他们会很快使用的东西,那么至少可以说,您将成为一个gonner。

听说过操作符注入吗?这样某人就可以在URL中形成一个可以从数据中收集数据的查询,就像BBBY表一样。一旦你接受了仍然需要执行的卫生处理,我还要补充你认为如果不使用索引,查询可能会导致系统的大量不必要的颠簸。