beego生产环境必须关闭调试模式、禁用自动api文档、过滤controller.data敏感字段、严格管控static/views路径。需设runmode=prod、docsautogen=false,用dto传参,移出views目录,nginx拦截敏感后缀及/docs等路径。

Beego 中 Revel 风格的调试信息泄露风险
Beego 默认开启调试模式(runmode = dev)时,会暴露完整路由表、控制器方法签名、模板路径甚至部分变量值。攻击者访问任意 404 路径(如 /nonexistent)就能看到带堆栈的错误页,里面常含绝对路径(如 /home/user/project/controllers/user.go)、数据库连接串片段或环境变量名。
必须关闭调试模式上线:在 conf/app.conf 中确认 runmode = prod,且禁止通过环境变量(如 BEEDGO_RUNMODE=dev)覆盖。生产环境若需日志追踪,改用 logs.AsyncLogger 记录错误到文件,而非返回给浏览器。
Controller.Data 未过滤直接输出导致敏感字段外泄
Beego 的 Controller.Data 是 map[string]interface{},常被用于透传数据给模板。但若开发者把原始数据库记录(如 user := &User{Password: "xxx", Salt: "abc"})整个塞进 c.Data["user"] = user,又在模板里写 {{.user}},JSON 序列化时可能意外暴露 Password 字段——尤其当结构体没加 json:"-" 或 json:"password,omitempty" 标签时。
实操建议:
- 永远用专用 DTO 结构体(如
UserDTO)替代原始模型传给前端,显式声明要输出的字段 - 对
Controller.Data中的每个值做类型断言和字段过滤,避免直接传指针或 map - 启用 Beego 的
AutoRender = false,手动控制 JSON 输出,配合json.Marshal前做字段裁剪
静态资源路径暴露源码结构
Beego 默认将 static/ 目录设为公开可访问,但若开发者把配置文件、SQL 脚本或备份文件(如 static/conf/db.sql.bak)误放其中,会被直接下载。更隐蔽的是,views/ 模板默认不解析,但某些配置下(如 EnableXSRF = true 未配全)可能触发模板引擎误加载,导致 .tpl 源码被原样返回。
关键检查点:
- 确认
static/下无.env、.sql、.bak、.log等敏感后缀文件 - 将
views/移出 Web 根目录,改用beego.BConfig.WebConfig.ViewsPath = "/abs/path/to/views"指向非公开路径 - 在 Nginx/Apache 层加
location ~ \.(env|sql|bak|log)$ { deny all; }双重拦截
未禁用 Beego 自动 API 文档(DocsAutoGen)
Beego 1.x 开启 DocsAutoGen = true 会自动生成 /docs 接口文档页,该页面不仅列出所有路由,还会渲染控制器注释中的参数说明——如果注释里写了 // @Param token query string true "用户认证 token(生产环境请勿明文传输)",这个提示本身就成了攻击线索。
生产环境必须关闭:
- 在
conf/app.conf中设DocsAutoGen = false - 删除项目中所有
//@router、//@Param等 Swagger 注释(它们只应在独立的 OpenAPI 工程中维护) - 检查
bee run启动日志,确认无[INFO] Docs Auto Generation Enabled提示
最易被忽略的是:即使关了 DocsAutoGen,旧版 Beego 仍可能响应 GET /swagger 返回空页面或 404,但扫描器会把它当有效端点持续探测。务必在反向代理层统一拦截所有 /docs、/swagger、/v1/api 类路径。











