buffalo 模板中 {{.content}} 默认转义,需用 {{.content | safehtml}} 关闭转义;必须确保传入内容已通过 bluemonday 等白名单过滤,否则直接使用 safehtml 有 xss 风险。

Buffalo 模板里 {{.Content}} 默认会转义,怎么关掉
Buffalo 的模板引擎(基于 html/template)默认对所有变量插值做 HTML 转义,这是安全机制,不是 bug。如果你明确要输出原始 HTML(比如富文本编辑器存的带 <p></p>、<strong></strong> 的内容),必须显式告诉模板“别转义”。
用 {{.Content | safeHTML}} 告诉 Buffalo 这是可信 HTML
Buffalo 继承了 Go 标准库 html/template 的 safeHTML 函数,这是唯一被官方支持且安全的绕过转义方式:
-
{{.Post.Body | safeHTML}}—— 正确,Body 是你确认已过滤 XSS 的 HTML 字符串 -
{{.UserInput | safeHTML}}—— 危险!用户直接提交的内容绝不能这么用 - 不要写
{{.Content | html}}或{{.Content | raw}},Buffalo 不识别这些函数 - 如果报错
function "safeHTML" not defined,说明你没用 Buffalo 自带的模板上下文(比如手写了template.New),得确保调用的是buffalo.Render
后端传参时别提前转义,否则 safeHTML 会双转义
常见坑:在 Go handler 里用 html.EscapeString 处理了内容,再传给模板,结果 {{.Content | safeHTML}} 输出的是 <p> 而不是 <p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2814" title="Buffalo框架 1.0.1"><img
src="https://img.php.cn/upload/manual/001/589/237/6ab32710f33a7477.png" alt="Buffalo框架 1.0.1" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2814" title="Buffalo框架 1.0.1" class="overflowclass">Buffalo框架 1.0.1</a>
<p class="overflowclass">Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2814" title="Buffalo框架 1.0.1" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>:
- ✅ 正确做法:数据库/ORM 返回的原始字符串(如
"<p>Hello & world</p>")直接传入 context - ❌ 错误做法:
c.Set("content", html.EscapeString(raw)),这会让safeHTML失效 - 注意:Buffalo 的
PopORM 默认不转义字段值,但如果你用了自定义扫描逻辑,得检查是否多套了一层转义
更安全的替代方案:服务端渲染前用 bluemonday 白名单过滤
直接信任 safeHTML 风险高,尤其面对用户输入。推荐组合使用:
- 引入
github.com/microcosm-cc/bluemonday对原始 HTML 做白名单清洗 - 在 handler 中处理:
policy := bluemonday.UGCPolicy(); cleanHTML := policy.Sanitize(rawHTML) - 再把
cleanHTML传给模板:c.Set("content", cleanHTML) - 模板里仍写
{{.content | safeHTML}}—— 这时它只是“取消转义”,不是“放行任意 HTML”
真正容易被忽略的点是:Buffalo 没有内置的 XSS 过滤中间件,safeHTML 本身不提供过滤能力,它只负责“不转义”。是否安全,全看你传进去的字符串是不是已经清洗过。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










