我正在为 NodeJS 使用Mongoose ODM 包装器,我担心注入攻击。假设我有以下架构:
const UserSchema = new mongoose.Schema({ userName: String, password: String });
如果我要执行如下所示的登录请求:
router.post('/login', (request, response) => {
const userName = request.body.userName;
const password = request.body.password;
User.findOne({ userName: userName }, function (error, user) {
// ... check password, other logic
});
});
我将对使用以下 JSON 有效负载的注入攻击持开放态度,该有效负载将始终找到用户:
{
"email": { "$gte": "" },
"password": { "$gte": "" }
}
我不关心密码,因为如果找到阻止任何实际登录的用户,它会被散列,但我想确保我的输入被清理,这样攻击者甚至不会做到这一点。
我知道在类似的StackOverflow 帖子中引用的mongo-sanitize NPM 包似乎删除了所有以“$”开头的 JSON 键。无论如何我都打算使用它,但我永远不会允许用户提交原始的、未解析的 JSON。在这种情况下,假设我进行了正确的检查,只在 userName 上调用 toString() 是一种好习惯吗?null
const userName = request.body.userName.toString();
这将消除查询的执行,但感觉不是很安全。我认为以下是一种更好的方法,因为它试图转换userName
为 a String
:
User.findOne({ userName: { "$eq": userName } }, function (error, user) {
// ... other logic
});
我在Model.findOne() 文档中找不到任何与此相关的内容,这让我相信我忽略了一些东西。
任何见解将不胜感激。
其他参考: