作为一个很长一段时间的web开发人员,我对所有内容的通常答案是使用RegEx检查来消除用户输入。当我查看Mongoose查询时,我的直觉告诉我,我不一定要压缩输入,假设可能会进行长度检查。
这假设express框架已经将输入过滤到req.body或req.query。
例如,在Mongoose中,典型的查询可能是这样的:
User.findOne({ username : req.query.username }, function(err, doc) {
// code
});
是否有可能在这个特定的查询中注入不好的东西?我希望是的,因为看起来黑客似乎总是使用非常聪明的东西,但是希望看到一些这样的例子。我问这个是因为这与其他方式不同,就是不进行字符串连接,而是使用已经是字符串或未定义的对象。谢谢!
如果我的偏离主题请移动它,我提前道歉,因为我不知道在哪里问这个。
答案 0 :(得分:2)
req.query.username
是您期望的值(如字符串),这是安全的。它不会尝试评估其中的任何JSON。如果req.query.username
是Object
,例如{ '$exists': true }
它将被评估并返回意外文档。
您的findOne示例相当“安全”,因为您在验证密码时会出错。对于像.remove()这样的其他查询,它会更加危险。
var param = { '$exists': true };
User.remove({ username : param }, function (err, affected) {
console.log(err)
console.log(affected)
});
这将删除集合中的所有用户:
这有帮助吗?
编辑:
使用PHP and Mongo时存在类似问题。其中很大程度上取决于快速框架不能从输入参数创建对象。