验证express-mongo-sanitize是否生效?MERN项目NoSQL注入防护测试疑问
问题原因说明
- express-mongo-sanitize的工作逻辑是仅移除请求体对象中以$开头的键名(即MongoDB操作符作为对象键存在的场景),你测试的场景中
{"$gt": ""}是username字段的字符串值,$gt是字符串内部的内容,不是请求体对象的顶层/嵌套键,所以该库不会做任何处理,属于预期行为。 - 你当前测试场景下存入的字符串本身不会带来NoSQL注入风险:只要你后续查询数据库时直接将该字符串作为查询条件的值使用,例如
User.findOne({ username: req.body.username }),MongoDB会直接将其作为普通字符串做匹配,不会解析成查询操作符执行。
真正有风险的场景
只有当你将用户输入的内容反序列化为对象后直接传入查询条件时,才会触发注入风险:
// 错误写法,会触发注入 const userInput = JSON.parse(req.body.username) await User.findOne({ username: userInput }) // 此时userInput是{ "$gt": "" },会匹配所有用户名不为空的用户
额外注意事项
- 确保你在配置安全中间件前已经先配置了
express.json()解析请求体:express-mongo-sanitize只能处理解析后的JS对象格式的req.body,如果没有提前配置JSON解析中间件,就算用户传入嵌套的带$操作符的对象,也会以原始字符串格式存在,中间件无法识别处理。 - 建议额外接入zod/joi等参数校验库,对username等字段限制字符串类型、合法字符范围与长度,从输入层过滤异常内容。
- 任何场景下都不要直接将用户输入的内容反序列化后作为MongoDB查询条件的对象使用。
内容的提问来源于stack exchange,提问作者Bugwhacker
相关产品推荐
相关产品推荐

