You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js/Mongoose API NoSQL注入测试效果及防护验证咨询

测试未生效的核心原因

你当前测试得到空数组,不代表接口具备NoSQL注入防护能力,问题出在你的传参方式不符合服务端的参数解析规则:

  • 默认情况下Express的query参数解析器会将URL中直接拼接的JSON字符串{"$ne": null}识别为纯字符串类型,而非对象类型。此时Mongoose执行的查询逻辑是匹配name字段等于字符串"{\"$ne\": null}"的用户,自然会返回空数组。你可以在服务端打印typeof req.query.name确认参数类型,如果返回值为string就说明你的payload根本没有被识别为MongoDB操作符。
  • 要让操作符生效,你需要改用Query String的对象传参格式,将请求地址改为 localhost:5000/api/users?name[$ne]=null,这种格式Express默认会将req.query.name解析为{$ne: null}对象。如果请求后返回了全量用户数据,就说明接口存在明确的NoSQL注入漏洞。

不要依赖“天然防护”,必须做参数校验

Mongoose的Schema类型校验不属于可靠的注入防护手段:

  • 仅当你name字段的Schema配置开启了查询强制类型转换时,才会把传入的操作符对象转为字符串,这个逻辑在不同Mongoose版本中表现不一致,且对Number、Array等其他类型的字段完全无效。
  • 生产环境必须显式做参数清洗:要么过滤所有查询参数中$开头的键,要么用Joi、express-validator等校验库严格限制参数类型,禁止查询字段接收Object类型的入参。

补充NoSQL注入测试用例

你可以通过以下测试进一步验证接口安全性:

  • 基础操作符覆盖测试:除了$ne、$gt外,测试name[$regex]=^a,验证是否能返回所有name以a开头的用户;测试name[$exists]=true,验证是否能返回所有存在name字段的用户。
  • 错误触发测试:传入非法操作符如name[$fakeOp]=1,如果服务端返回MongoDB原生报错信息,说明注入参数已经透传到数据库层,漏洞确实存在。
  • 多参数组合测试:如果接口支持同时传入多个查询条件(比如同时按name和age筛选),可以同时给多个字段传入操作符,验证是否能绕过限制返回全量数据。
  • 嵌套字段测试:如果查询逻辑包含嵌套字段(比如user.profile.name),测试user.profile.name[$ne]=null是否能生效。

内容的提问来源于stack exchange,提问作者Vincenzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:27:04