revel模板默认不自动转义,需显式使用esc函数对用户输入做html实体转义以防止xss;raw函数可绕过转义但风险极高;不同上下文(如属性值、url)需配合对应编码策略。

在 Revel 框架中渲染用户输入内容时,若未正确处理 HTML 转义,浏览器会将、&、"、'等字符解析为标签或属性,导致脚本执行、Cookie 窃取或页面结构破坏。
Revel 模板默认是否自动转义
Revel 的模板引擎【默认不自动转义】任何变量输出。这意味着{{.UserName}}会原样插入 HTML,若UserName值为<script>alert(1)</script>,它将在客户端直接执行。
这与 Go 标准库 html/template 的安全默认不同——Revel 选择显式控制权,把责任交还给开发者,但也埋下高风险隐患。
强制 HTML 转义:使用 esc 函数
Revel 内置 esc 函数,对变量做标准 HTML 实体转义:
在模板中写:{{esc .Bio}} → 将
”。
该函数等效于 Go 的html.EscapeString(),覆盖、&、"、'五个核心危险字符。
注意:esc 不处理 JavaScript 上下文或 URL 属性中的特殊规则,仅适用于普通 HTML 标签体内容。
绕过转义:使用 raw 函数(慎用)
方法一:当确认数据已由后端净化(如经 DOMPurify 处理)且需渲染富文本时,可用 raw:
{{raw .ArticleHTML}}
方法二:若需拼接多个已转义片段,可先在控制器中组合再传入模板,避免在模板里混用 raw 和普通变量。
【raw 是不可逆操作,一旦传入含恶意脚本的字符串,XSS 立即触发】
不同输出上下文的安全写法
第一步:插入 HTML 标签体内(如
)→ 使用 esc
第二步:插入双引号属性值(如)→ 必须同时 esc,且确保属性值用双引号包裹;若用户输入含",esc 会转为",防止属性提前闭合
第三步:插入单引号属性值(如
第四步:插入 href 或 src 属性(如)→ 不能只靠 esc,必须在控制器中用 url.QueryEscape 或类似方式编码,再传入模板;否则 javascript:alert(1) 会被完整保留并执行
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











