从URL查询string直接提供的mongo查询有多危险?
我正在玩node.js , express和mongoose 。
为了使事情正常运行,我将Express查询string对象直接传递给了一个mongoose查找函数。 我感到好奇的是这种做法在现场应用程序中有多危险。 我知道一个RDBMS将非常容易被SQL注入。 除了“清理你的投入”的好build议,这个代码有多恶心:
app.get('/query', function (req, res) { models.findDocs(req.query, function (err, docs) { res.send(docs); }); });
这意味着aa获取请求到http://localhost:8080/query?name=ahsteele&status=a
只会将以下内容插入到findDocs函数中:
{ name: 'ahsteele', status: 'a' }
这有很多原因会让人觉得不舒服,但这有多危险呢? 将查询parameter passing给mongodb的最佳做法是什么? 快递是否提供任何现成的卫生处理?
就注入问题而言,像SQL一样,风险显着较低…虽然理论上可能通过未知的攻击媒介。
数据结构和协议是二进制和API驱动的,而不是利用域特定语言中的转义值。 基本上,你不能欺骗分析器在最后添加一个“; db.dropCollection()”。
如果它只用于查询,那可能是好的…但是我仍然会提醒你使用一点validation:
- 确保只有字母数字字符(过滤或无效的空值和其他任何你通常不会接受的)
- 每个术语强制最大长度(如255个字符)
- 强制整个查询的最大长度
- 删除以“$”开头的特殊参数名称,如“$ where”等
- 不要允许嵌套的数组/文件/散列…只有string和整数
另外请记住,一个空的查询返回一切。 您可能需要对该返回值进行限制。 🙂
操作符注入在这里是一个严重的问题,我会build议你至less编码/转义某些字符,更具体的$
符号: http : //docs.mongodb.org/manual/faq/developers/#dollar-sign-operator-escaping
如果允许用户在$_GET
或$_POST
内的string或元素的开头追加一个$
符号,或者他们会很快用它来: http ://xkcd.com/327/,至less可以说。
据我所知快递并没有提供任何消毒箱控制卫生。 要么你可以编写你自己的中间件,我们可以用你自己的逻辑做一些基本的检查。正如你所说的,你提到的情况有点危险。
但是为了方便使用,Mongoose模型中内置的所需types至less可以为您提供默认的清理和对进入或未进入的内容的一些控制。
比如像这样的东西
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 } }
});
检查这个更多的信息也。