【发布时间】:2014-11-24 23:53:15
【问题描述】:
我创建了一组基于 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'});
});
}
});
如何验证输入的架构?除了用数千个巨大的输入填充数据库之外,是否有可能利用此代码注入一些代码?如果是,如何预防?
非常感谢!
【问题讨论】:
标签: node.js mongodb security express sql-injection