出于安全考虑,我们是否需要过滤Mongoose中的用户查询?



作为一个长期的web开发人员,我通常的回答是使用RegEx检查来紧张用户输入。当我看到Mongoose查询时,我的直觉告诉我,我不一定要紧张输入,假设长度检查可能。

这是假设express框架已经将输入过滤到req。Body or req.query.

例如,在Mongoose中,一个典型的查询如下:

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

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

请移开这个,如果它离题了,我提前道歉,因为我不知道在哪里问这个

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和Mongo时也有类似的问题。这很大程度上取决于express框架不根据输入参数创建对象。

最新更新