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

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鉴权:
    1. 安装依赖npm install jsonwebtoken express-jwt
    2. 在路由中添加校验中间件,只有携带合法授权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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:18:01