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

Go 的 html/template 包专为安全生成 HTML 而设计,能自动转义动态内容,防止 XSS 攻击。只要使用正确,即便插入用户输入也能保证输出安全。
基础用法:自动转义变量
使用 html/template 时,所有通过 {{.}} 插入的变量都会被自动转义。
示例:
package mainimport ( "html/template" "log" "os")func main() { const tpl = `用户名: {{.Username}}
立即学习“go语言免费学习笔记(深入)”;
` t := template.Must(template.New("example").Parse(tpl)) data := struct { Username string }{ Username: `alert("xss")`, // 恶意输入 } err := t.Execute(os.Stdout, data) if err != nil { log.Fatal(err) }}
输出结果:
用户名: alert(“xss”)
原始脚本被转义,不会执行。
插入已信任的HTML内容
有时需要渲染合法的 HTML(如富文本内容),可使用 template.HTML 类型告诉模板该内容已净化。
注意:必须确保内容安全后再使用。
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。关键在于信任边界清晰——只对真正可信的内容取消转义。
以上就是Golang html/template安全生成HTML示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1415117.html
微信扫一扫
支付宝扫一扫