我与玩耍的node.js , 快递 ,和猫鼬 。
对于得到的东西和运行现在我直接通过快递查询字符串对象到猫鼬查找功能的缘故。 我很好奇的是如何将危险的这种做法是在现场应用。 我知道,一个RDBMS将是非常容易受到SQL注入。 除了良好的建议“净化你输入”邪恶这怎么代码:
app.get('/query', function (req, res) {
models.findDocs(req.query, function (err, docs) {
res.send(docs);
});
});
这意味着AA get请求http://localhost:8080/query?name=ahsteele&status=a
只会推下到findDocs功能:
{
name: 'ahsteele',
status: 'a'
}
这感觉恶心了很多的原因,但是是怎么不安全呢? 什么是传递查询参数的MongoDB的最佳实践? 是否体现提供任何开箱消毒的?
至于注射是问题,就像SQL,风险是通过一个未知的攻击向量显著降低......尽管理论上是可能的。
的数据结构和协议是二进制和API驱动,而不是一个特定于域的语言内利用转义值。 基本上,你不能只是欺骗解析器为加入;末“db.dropCollection()”。
如果它仅用于查询,它可能是罚款...但我还是提醒您要使用验证的一点点:
- 确保只有字母数字字符(过滤器或无效的空值和其他任何你通常不会接受)
- 执行每一个术语最大长度(例如255个字符)
- 强制整个查询的最大长度
- 剥去开始“$” 特殊参数的名称,如“$其中”与这样的
- 不允许嵌套数组/文件/散列...只有字符串和整数
此外,请记住,一个空的查询返回的一切。 你可能想对返回值的上限。 :)
操作注射是一个严重的问题,在这里,我建议你至少编码/逃避某些字符,更具体的$
符号: http://docs.mongodb.org/manual/faq/developers/#dollar-sign-operator-escaping
如果用户允许一个追加$
符号的字符串或元素的开始在您$_GET
或$_POST
或任何他们很快就会用它来: http://xkcd.com/327/ ,你将是一个gonner,至少可以说。
据我所知快递犯规提供任何开箱控制消毒的。 不管是你说你提到的情况是有点冒险,你可以编写自己的中间件我们做一些基本的检查,在你自己的logic.And。
但是,为了便于使用,内置猫鼬模型所需要的类型,至少给你默认sanitizations和在什么进入或没有一定的控制。
例如,像这样
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
文章来源: How dangerous is a mongo query which is fed directly from a URL query string?