Node.js,Express.js和MongoDB - 关于使用find和insert的用户输入的安全性

时间:2014-09-30 11:11:18

标签: node.js mongodb security express sql-injection

我基于Express.js创建了一组REST服务,以查找存储在Mongo数据库中的一些结果。其中一个服务的代码的最小版本可能是:



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'});
        });
    }
});




如何验证输入的架构?除了用数以千计的巨大输入填充数据库之外,是否可以利用此代码注入一些代码?如果是的话,如何防止这种情况?

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

我进入细节,因为我不是这里的专家,但here is an article我发现在使用mongo和node.js时,我发现它真的很容易出现漏洞。

为了验证模型,我使用mongoose作为我的mongoDB的客户端,它有很多帮助,因为它有自己的验证器,你也可以自己创建。

我希望它可以帮助您进行搜索。

答案 1 :(得分:1)

Mongodb访问是基于api的,因为选择基于语言的SQL。 SQL是一种语言,如果您让用户的输入插入到语言中,那么很容易编写代码并为数据库执行几乎所有操作。

MongoDB有一种不同的方法,当你进行搜索时,你调用一个API函数来进行搜索,而这个API函数只能进行搜索。

如果您让用户选择字段和值,那么他可以进行您不期望的搜索,但这就是全部。

这同样适用于插入,更新和删除,请注意不要让用户选择字段和值,因为他可以选择您不希望也不想要的那些。