Node.js+Express搭建的MongoDB接口在/api路径全量暴露如何隐藏?
问题根因
你访问example.com/api返回全量数据库内容的问题和Caddy配置无关,Caddy的反向代理逻辑是正确的,问题出在Node.js侧的接口业务逻辑:
你的crypto.route.js文件中,/路径的GET接口未做任何访问限制、参数校验,直接调用CryptoModel.find()返回了sentences_nouns集合的全部数据。
解决方案
可根据你的业务需求选择以下任意一种方案处理:
- 如果这个全量查询接口本身没有业务用途,直接删除
crypto.route.js中的对应代码块即可:
cryptoRoute.route('/').get((req, res) => { CryptoModel.find((error, data) => { if (error) { return next(error) } else { res.json(data) } }) })
删除后再访问/api路径就会返回404错误,不会泄露数据库内容。
- 如果该接口需要保留给内部使用,添加身份校验逻辑,比如常用的JWT鉴权:
- 安装依赖
npm install jsonwebtoken express-jwt - 在路由中添加校验中间件,只有携带合法授权token的请求才能访问接口:
const { expressjwt } = require("express-jwt"); // 只有请求头携带正确Bearer token的请求才能通过校验 cryptoRoute.use(expressjwt({ secret: '你的自定义密钥', algorithms: ["HS256"] })) - 安装依赖
- 如果接口需要对外提供,但不允许返回全量数据,添加查询限制:
可以增加分页、参数筛选逻辑,比如限制每次最多返回10条数据,同时屏蔽不需要对外暴露的字段,示例代码:cryptoRoute.route('/').get((req, res, next) => { // 只返回前10条数据,同时排除_id、__v等敏感字段 CryptoModel.find({}, { _id: 0, __v: 0 }).limit(10).exec((error, data) => { if (error) { return next(error) } else { res.json(data) } }) })
额外安全优化建议
- 当前
/add-crypto接口也没有任何权限校验,任何人都可以向你的数据库写入数据,建议也同步添加鉴权逻辑和参数合法性校验。 - 生产环境不要使用全量允许的CORS配置,把
app.use(cors())修改为指定允许的域名,避免跨域滥用:app.use(cors({ origin: 'https://example.com' })) - 所有对外接口都要做好参数校验、频率限制,避免被恶意爬取或攻击。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

