MongoDB中的JavaScript NoSQL注入预防

我怎样才能防止JavaScript的NoSQL注入到MongoDB?

我正在研究一个Node.js应用程序,并将req.body (这是一个json对象)传递到req.body模型的保存函数中。 我认为幕后有保障措施,但似乎并非如此。

注意我的答案可能不再相关。 请参阅其他答案。

当客户端程序在MongoDB中组装一个查询时,它会build立一个BSON对象,而不是一个string。 因此传统的SQL注入攻击不成问题。

有关详细信息,请按照文档

UPDATE

避免像eval这样的expression式可以执行任意的JS。 如果您正在从用户那里接受input,并且在不清除input的情况下像expression式那样运行eval ,那么您可能会搞砸 正如JoBu1324指出的那样,像wheremapReducegroup这样的操作可以直接执行JSexpression式。

苏珊特的答案是不正确的。需要了解MongoDB中的NoSQL注入。

示例 (从这里取得 )

 User.findOne({ "name" : req.params.name, "password" : req.params.password }, callback); 

如果req.params.password{ $ne: 1 } ,用户将被检索而不知道密码( $ne表示不等于1 )。

MongoDB驱动程序

你可以使用mongo-sanitize :

它将删除input中以'$'开头的任何键,因此可以将其传递到MongoDB,而不用担心恶意用户覆盖。

 var sanitize = require('mongo-sanitize'); var name = sanitize(req.params.name); var password = sanitize(req.params.password); User.findOne({ "name" : name, "password" : password }, callback); 

mongoose驱动程序

如果它遵循一个模式,如果密码是一个string字段,它会将对象{ $ne: 1 }为string,并且不会造成损害。 在这种情况下,你不需要清理,只要记得设置一个适当的模式。

虽然这个post已经过时了,但我正在回答。

我知道三种方式。

首先:有一个多用途的内容filter 。 还通过过滤方式提供了MongoDB注入保护。

第二: mongo-sanitize ,帮助者清理mongodb查询与查询select器注入。

第三:我在这里看到了这个可以应用于MongoDB的解决scheme。 实现起来非常简单。 只使用JavaScript的内置的escape()函数。

escape()将string转换为ascii码。 $ne转换成%24ne

 var privateKey = escape(req.params.privateKey); App.findOne({ key: privateKey }, function (err, app) { //do something here }