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指出的那样,像where
, mapReduce
和group
这样的操作可以直接执行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 }