必须禁用服务端JavaScript执行,否则db.eval()、$where、$function等构成高危面;需通过db.runCommand({getParameters:1,javascriptEnabled:1})确认状态,配置文件中设security.enableJavaScript:false(4.2–5.0),6.0+默认禁用;$function需db.adminCommand({setParameter:1,disableJavaScript:true})运行时关闭,mapReduce需禁用相关角色权限;应用层须正则拦截含$where、$function等字段的请求;mongo-express等工具需单独关闭其JS开关。

必须禁用服务端 JavaScript 执行,否则 db.eval()、$where、$function 等入口始终构成高危面;仅靠应用层过滤不能替代服务端关闭。
确认 javascriptEnabled 当前状态是否开启
连入 MongoDB shell 后执行:db.runCommand({ getParameter: 1, javascriptEnabled: 1 })
若返回 {"javascriptEnabled": true, "ok": 1},说明仍启用;若报错 no such command 或返回 false,基本已禁用。注意:该命令本身不执行 JS,是安全探测方式。
配置文件中显式关闭 enableJavaScript(不是 disableJavaScript)
disableJavaScript 是伪配置项,根本不存在于任何 MongoDB 官方文档或源码中。正确写法是:
security:<br> enableJavaScript: false
适用于 4.2–5.0 版本;6.0+ 默认禁用且拒绝识别该参数,省略即可。必须重启
mongod 进程才生效,重载配置无效。
额外堵住 $function 和 mapReduce 这两个漏网入口
$function(4.4+ 引入)和 mapReduce(5.0+ 默认禁用但可手动开)不受 enableJavaScript 控制,需单独处理:
- 对
$function:运行db.adminCommand({ setParameter: 1, disableJavaScript: true })(注意这是运行时命令,非配置项) - 对
mapReduce:确保配置中未设置enableJavaScript: true,且禁止普通用户拥有clusterAdmin或dbAdmin角色 - 所有含 JS 的操作符(
$where、$function、$accumulator)应在应用层正则拦截请求体,直接拒掉包含这些字段的查询
立即学习“Java免费学习笔记(深入)”;
禁用后仍要检查的三个隐蔽风险点
即使 javascriptEnabled: false 生效,以下场景仍可能绕过或引发等效风险:
-
mongo-express等 Web 管理工具若自带eval封装,需单独关其enableJavaScript开关(非 MongoDB 配置) - 旧版驱动(如 PyMongo db.command("eval", ...) 静默降级而非报错,务必升级到匹配 MongoDB 版本的驱动
-
$regex虽不执行 JS,但配合$options: "i"且未转义输入时,仍可被用于全表扫描或 DoS,必须做字符转义:req.query.q.replace(/[.*+?^${}()|[]]/g, '\$&')
最易被忽略的是:$function 默认启用、不校验函数签名、不限制执行时长——传一个 "while(true){}" 就能拖垮整个 mongod 进程,且它不会出现在 javascriptEnabled 的控制范围内。



















