使用 html/template 可自动转义变量防止 XSS,如 {{.Username}} 会转义恶意脚本;需插入可信 HTML 时可使用 template.HTML 类型,但必须确保内容安全;应避免手动拼接 HTML,而将原始数据交由模板处理,以保证各上下文正确转义。

Go 的 html/template 包专为安全生成 HTML 而设计,能自动转义动态内容,防止 XSS 攻击。只要使用正确,即便插入用户输入也能保证输出安全。
基础用法:自动转义变量
使用 html/template 时,所有通过 {{.}} 插入的变量都会被自动转义。
示例:
package main
import (
"html/template"
"log"
"os"
)
func main() {
const tpl = `用户名: {{.Username}}
立即学习“go语言免费学习笔记(深入)”;
`
t := template.Must(template.New("example").Parse(tpl))
data := struct {
Username string
}{
Username: ``, // 恶意输入
}
err := t.Execute(os.Stdout, data)
if err != nil {
log.Fatal(err)
}
}
输出结果:
用户名: zuojiankuohaophpcnscriptyoujiankuohaophpcnalert("xss")zuojiankuohaophpcn/scriptyoujiankuohaophpcn
原始脚本被转义,不会执行。
插入已信任的HTML内容
有时需要渲染合法的 HTML(如富文本内容),可使用 template.HTML 类型告诉模板该内容已净化。
注意:必须确保内容安全后再使用。
1、对ASP内核代码进行DLL封装,从而大大提高了用户的访问速度和安全性;2、采用后台生成HTML网页的格式,使程序访问速度得到进一步的提升;3、用户可发展下级会员并在下级购买商品时获得差额利润;4、全新模板选择功能;5、后台增加磁盘绑定功能;6、后台增加库存查询功能;7、后台增加财务统计功能;8、后台面值类型批量设定;9、后台财务曲线报表显示;10、完善订单功能;11、对所有传输的字符串进行安全
data := struct {
Content template.HTML
}{
Content: template.HTML(`这是加粗文本`),
}
模板中:
{{.Content}}此时内容不会被转义,直接输出为 HTML 标签。
常见安全类型说明
html/template 提供多种标记类型来安全处理不同上下文:
- template.HTML – 可信 HTML 字符串
- template.CSS – 可信 CSS 内容
- template.JS – 可信 JavaScript 代码
- template.URL – 可信 URL(用于 href、src 等)
这些类型绕过转义,但需开发者负责其安全性。
避免手动拼接 HTML
不要在 Go 代码中拼接 HTML 字符串传给模板,例如:
// 错误做法 UnsafeHTML := "" + userName + ""应将原始数据传入模板,由模板系统处理转义:
{{.UserName}}这样每个字段会在对应上下文中正确转义。
基本上就这些。只要坚持使用 html/template 并合理使用 template.HTML 等类型,就能在 Golang 中安全生成 HTML。关键在于信任边界清晰——只对真正可信的内容取消转义。










