出于安全考虑,我们是否需要在Mongoose中对用户查询进行压缩或过滤?

时间:2014-07-24 17:52:36

标签: node.js mongodb mongoose

作为一个很长一段时间的web开发人员,我对所有内容的通常答案是使用RegEx检查来消除用户输入。当我查看Mongoose查询时,我的直觉告诉我,我不一定要压缩输入,假设可能会进行长度检查。

这假设express框架已经将输入过滤到req.body或req.query。

例如,在Mongoose中,典型的查询可能是这样的:

User.findOne({ username : req.query.username }, function(err, doc) {
  // code
});

是否有可能在这个特定的查询中注入不好的东西?我希望是的,因为看起来黑客似乎总是使用非常聪明的东西,但是希望看到一些这样的例子。我问这个是因为这与其他方式不同,就是不进行字符串连接,而是使用已经是字符串或未定义的对象。谢谢!

如果我的偏离主题请移动它,我提前道歉,因为我不知道在哪里问这个。

1 个答案:

答案 0 :(得分:2)

req.query.username是您期望的值(如字符串),这是安全的。它不会尝试评估其中的任何JSON。如果req.query.usernameObject,例如{ '$exists': true }它将被评估并返回意外文档。

您的findOne示例相当“安全”,因为您在验证密码时会出错。对于像.remove()这样的其他查询,它会更加危险。

var param = { '$exists': true };

User.remove({ username : param }, function (err, affected) {
    console.log(err)
    console.log(affected)
});

这将删除集合中的所有用户:

这有帮助吗?


编辑:

使用PHP and Mongo时存在类似问题。其中很大程度上取决于快速框架不能从输入参数创建对象。