Mongoose 查询真的能防 SQL 注入吗?

小乙豪 阅读 21

我最近在用 Mongoose 做一个用户搜索功能,前端传个用户名过来,后端直接用 User.findOne({ username: req.query.name }) 查询。听说 Mongoose 会自动转义,但不确定是不是真的安全。有没有可能被注入?比如传个 {"$ne": ""} 这种会不会绕过?

我试过手动用 req.query.name = { "$gt": "" } 模拟攻击,结果还真查出数据了!这算不算注入?Mongoose 不是说能防注入吗?到底该怎么写才安全?

const user = await User.findOne({
  username: req.query.name // 这样写安全吗?
});
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
a'ゞ新红
Mongoose 自动转义确实能防止一部分 SQL 注入,但对于复杂的查询对象,它并不能完全防止注入。你提到的 {"$ne": ""} 就是一个例子,这种情况下可能会绕过简单的验证。

代码放这了,你可以通过检查传入的查询参数是否为字符串来增加一层安全性:

if (typeof req.query.name !== 'string') {
return res.status(400).send('Invalid query parameter');
}

const user = await User.findOne({
username: req.query.name
});


这样可以确保 req.query.name 是一个字符串,而不是一个对象,从而防止注入攻击。别忘了在实际项目中加入更多的错误处理和日志记录。
点赞
2026-03-24 11:01