第一章:Go模板引擎安全漏洞全揭示(防范XSS攻击的必备方案)
Go语言内置的text/template和html/template包为Web应用提供了强大的动态页面渲染能力,但若使用不当,极易引发跨站脚本(XSS)安全漏洞。尤其是开发者误用text/template处理HTML内容,或在html/template中绕过自动转义机制时,攻击者可注入恶意脚本,窃取用户会话或执行非法操作。
正确选择模板包
text/template:仅用于生成纯文本,不具备HTML上下文感知能力html/template:专为HTML输出设计,自动对数据进行上下文敏感的转义
package main
import (
"html/template"
"log"
"os"
)
func main() {
const tpl = `<p>用户名: {{.}}</p>`
// 使用 html/template 自动转义恶意内容
t := template.Must(template.New("xss").Parse(tpl))
// 模拟用户输入包含脚本
userInput := `<script>alert('XSS')</script>`
// 输出: <p>用户名: <script>alert('XSS')</script></p>
if err := t.Execute(os.Stdout, userInput); err != nil {
log.Fatal(err)
}
}
上述代码中,html/template自动将特殊字符转换为HTML实体,阻止脚本执行。
禁止滥用未转义输出
避免使用template.HTML类型强制标记内容为“安全”,除非内容经过严格校验:
// ❌ 危险:信任用户输入
// return template.HTML(userInput)
// ✅ 安全:始终视为未信任数据
return template.HTMLEscapeString(userInput)
| 上下文类型 | 转义方式 | 示例输入 | 输出结果 |
|---|---|---|---|
| HTML文本 | HTML实体编码 | <script> |
<script> |
| 属性值 | 引号+编码 | " onmouseover="alert() |
" onmouseover="... |
| JavaScript上下文 | \x转义+上下文分析 | ` | |
