使用 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 = `<p>用户名: {{.Username}}</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p>`
t := template.Must(template.New("example").Parse(tpl))
data := struct {
Username string
}{
Username: `<script>alert("xss")</script>`, // 恶意输入
}
err := t.Execute(os.Stdout, data)
if err != nil {
log.Fatal(err)
}
}
输出结果:
<p>用户名: <script>alert("xss")</script></p>原始脚本被转义,不会执行。
有时需要渲染合法的 HTML(如富文本内容),可使用 template.HTML 类型告诉模板该内容已净化。
注意:必须确保内容安全后再使用。
data := struct {
Content template.HTML
}{
Content: template.HTML(`<strong>这是加粗文本</strong>`),
}
模板中:
{{.Content}}此时内容不会被转义,直接输出为 HTML 标签。
html/template 提供多种标记类型来安全处理不同上下文:
这些类型绕过转义,但需开发者负责其安全性。
不要在 Go 代码中拼接 HTML 字符串传给模板,例如:
// 错误做法 UnsafeHTML := "<a href='" + userURL + "'>" + userName + "</a>"应将原始数据传入模板,由模板系统处理转义:
{{.UserName}}这样每个字段会在对应上下文中正确转义。
基本上就这些。只要坚持使用 html/template 并合理使用 template.HTML 等类型,就能在 Golang 中安全生成 HTML。关键在于信任边界清晰——只对真正可信的内容取消转义。
以上就是Golang html/template安全生成HTML示例的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号