MongoDB中的JavaScript NoSQL注入预防

dan*_*iel 13 javascript javascript-injection mongoose mongodb node.js

如何防止JavaScript NoSQL注入MongoDB?

我正在开发一个Node.js应用程序,我正在将req.body一个json对象传递给mongoose模型的save函数.我认为幕后有保护措施,但事实并非如此.

Zan*_*non 24

Sushant的回答不正确.需要了解MongoDB中的NoSQL注入.

示例(取自此处)

User.findOne({
    "name" : req.params.name, 
    "password" : req.params.password
}, callback); 
Run Code Online (Sandbox Code Playgroud)

如果req.params.password{ $ne: 1 },则在不知道密码的情况下检索用户($ne意味着不等于1).

MongoDB驱动程序

你可以使用mongo-sanitize:

它会删除输入中以'$'开头的所有键,因此您可以将其传递给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); 
Run Code Online (Sandbox Code Playgroud)

猫鼬司机

由于它遵循模式,如果密码是字符串字段,它将把对象转换{ $ne: 1 }为字符串,不会造成任何损坏.在这种情况下,您不需要清理,只需记住设置正确的架构.


efk*_*kan 8

虽然这篇文章已经过时,但我正在回答.

我知道三种方式.

第一:有一个多用途内容过滤器.还通过过滤方式提供MongoDB注入保护.

第二: mongo-sanitize,帮助清理mongodb查询以查询选择器注入.

第三:在这里看到这个可以应用于MongoDB的解决方案.它实现起来非常简单.仅使用escape()JavaScript的内置函数.

escape()将字符串转换为ascii代码.$ne转换成%24ne.

var privateKey = escape(req.params.privateKey);

App.findOne({ key: privateKey }, function (err, app) {
  //do something here
}
Run Code Online (Sandbox Code Playgroud)


Sus*_*pta -3

注意 我的答案不正确。请参考其他答案。

--

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

详细信息请参阅文档

更新

eval避免像这样可以执行任意JS的表达式。如果您从用户那里获取输入并运行eval类似的表达式而不清理输入,您可能会搞砸。正如 JoBu1324 所指出的, 、 和 等操作where允许mapReduce直接group执行 JS 表达式。

  • 我会添加一个“但是,请注意 JavaScript 注入!” 到答案。请阅读http://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf。 (3认同)