2014-09-30 54 views
0

我创建了一组基于Express.js的REST服务,以查找存储在Mongo数据库中的一些结果。代码为服务的一个非常最小版本可以是这样的:Node.js,Express.js和MongoDB - 使用查找和插入的用户输入安全

var express = require('express'); 
 
var app = express(); 
 
var bodyParser = require('body-parser'); 
 
var mongoClient = require('mongodb').MongoClient; 
 

 
app.use(bodyParser.urlencoded({ extended: false })); 
 
app.use(bodyParser.json()); 
 

 
app.get('/results/:name', function(req, res){ 
 
    var name = req.params.name; 
 
    mongoClient.connect('mongodb://localhost/test', function (err, db) { 
 
     var collection = db.collection('results'); 
 
     collection.find({ name: name }).toArray(function (err, docs) { 
 
      res.json({results: docs}); 
 
     }); 
 
    }); 
 
}); 
 

 
app.listen(3000);

我从Java快到了,我已经在过去的SQL注入殴打。所以我不太愿意直接在查找请求中使用用户的输入。凭借我对这个主题的非常薄弱的​​知识,我尝试了几个特殊字符(})“';等等),但是我一直没有能够产生任何奇怪的结果。验证或检查,我应该执行,以确保它是不可能将代码注入或使程序失败

现在,让我们做一些愚蠢的事,让我们的用户信任输入正确的记录:

app.post('/results/', function(req, res){ 
 
    var record = req.body; 
 
    if(record.name) { 
 
     mongoClient.connect('mongodb://localhost/test', function (err, db) { 
 
      var collection = db.collection('results'); 
 
      collection.insert(record, function(err, doc){}); 
 
      res.json({message: 'ok'}); 
 
     }); 
 
    } 
 
});

如何验证输入的模式?除了用数千个巨大的输入填充数据库之外,是否可以利用此代码来注入一些代码?如果是的话,如何防止呢?

非常感谢!

回答

1

我会把这作为一个评论,但由于我还没有被允许这样做,我只是把它作为一个响应。

我进入细节,因为我不是这里的专家,但here is an article我发现当使用mongo和node.js时,我发现实际上对于漏洞有非常大的影响。

对于验证模型,我使用猫鼬作为我的mongoDB的客户端,它有很多帮助,因为它有自己的验证器,您也可以自己创建。

我希望它可以帮助你进入你的搜索。

+0

谢谢!这正是我正在寻找的那种文章。 – Jason 2014-09-30 11:55:11

1

对于基于语言的SQL,Mongodb访问是基于api的。 SQL是一种语言,如果你让用户的输入被插入到语言中,那么很容易进行代码注入,并且几乎所有事情都可以在你的数据库中完成。

MongoDB有一个不同的方法,当您正在进行搜索时,您调用API函数来执行搜索,并且此API函数只能执行搜索。

如果您让用户选择字段和值,那么他可以进行您不期望的搜索,但仅此而已。

同样适用于插入,更新和删除,小心不要让用户选择字段和值,因为他可以选择你不期望或不想要的。