Beego 不提供自动 XSS/SQL 注入过滤中间件,需开发者显式配置;XSS 防御依赖模板默认 HTML 转义(如 {{.Var}}),而非中间件。

Beego 框架本身不提供开箱即用的「自动 XSS/SQL 注入过滤中间件」,所有防御必须由开发者显式启用、配置并配合 ORM 或参数绑定使用;盲目依赖框架默认行为极易导致漏防。
Beego 的 XSS 防御靠模板自动转义,不是中间件
Beego 的 template 引擎默认对 {{.Var}} 中的变量内容执行 HTML 转义(如 → <code>),这是 XSS 防御的第一道防线,但它只在模板渲染层生效,且对 <code>{{.Var|safe}} 或 html/template.HTML 类型值完全绕过。
- 若你在控制器里拼接 HTML 字符串再传给模板(如
this.Data["content"] = "<script>alert(1)</script>"),又用了|safe,XSS 立刻触发 - 前端通过 AJAX 提交富文本时,后端未做内容清洗就存入数据库,下次渲染仍可能被触发(尤其配合
|safe) - Beego 没有类似 Django 的
django.middleware.security.SecurityMiddleware那种全局响应头注入 XSS 保护头(如X-XSS-Protection)的内置中间件
真正可控的做法是:禁用 |safe,所有用户输入统一走 html.EscapeString() 预处理,或引入 bluemonday 库白名单过滤 HTML。
SQL 注入防御只能靠 ORM 查询 + 参数化,和中间件无关
Beego 的 orm 包(基于 github.com/astaxie/beego/orm)在调用 QueryTable().Filter().All() 或 Raw().Exec() 时,**仅当使用参数占位符(? )且传参为独立变量时才安全**;任何字符串拼接 SQL 都会直接失效防护。
-
o.Raw("SELECT * FROM user WHERE name = ?", name).QueryRows(&users)✅ 安全 -
o.Raw("SELECT * FROM user WHERE name = '" + name + "'").QueryRows(&users)❌ 经典注入点 -
o.QueryTable("user").Filter("name__icontains", "%"+keyword+"%")✅ ORM 自动转义 -
o.QueryTable("user").Filter("name__icontains", "%"+keyword+"%").Filter("id IN ("+ids+")")❌ids若来自用户输入,立刻中招
你无法靠写一个中间件“扫描所有 SQL 字符串”来拦截注入——Go 是编译型语言,SQL 在运行时才构造,中间件根本看不到原始 SQL 文本。防御必须前置到 ORM 调用层。
可手动编写轻量中间件做基础请求净化
虽然 Beego 不内置 XSS/SQL 防御中间件,但你可以用 beego.InsertFilter() 注册自定义中间件,在请求进入控制器前做简单预处理:
- 对
this.Input().Get("q")、this.Input().Get("content")等常见字段调用html.EscapeString()或正则过滤 script/style 标签(仅适合纯文本场景) - 拒绝含
UNION SELECT、EXEC xp_cmdshell、<script> 等高危关键字的请求(注意:关键词检测易被绕过,不能替代参数化)</script> - 设置响应头:
this.Ctx.ResponseWriter.Header().Set("X-Content-Type-Options", "nosniff")和"X-Frame-Options", "DENY"
示例中间件片段:
func XSSCleaner(ctx *context.Context) {
// 仅处理 GET/POST 表单字段,不处理 JSON body
for key := range ctx.Input().GetStrings() {
if v := ctx.Input().Get(key); v != "" {
ctx.Input().Set(key, html.EscapeString(v))
}
}
}
beego.InsertFilter("/*", beego.BeeApp.Handlers.BeforeRouter, XSSCleaner)
注意:这个中间件对 JSON 请求体、文件上传、URL 路径参数均无效,且会破坏富文本编辑器等合法场景——它只是辅助手段,不是银弹。
最常被忽略的一点:Beego 的 orm.Debug = true 会把完整 SQL 打印到日志,若日志被攻击者获取,等于直接暴露注入点构造方式;生产环境必须关掉。


















