范围内的转义模板
Posted
技术标签:
【中文标题】范围内的转义模板【英文标题】:escape template in range 【发布时间】:2021-02-28 06:38:49 【问题描述】:我想打印用户列表,如:<@user1> <@user2>
,这是我公司内部的一种内部格式,但 golang 模板总是将&lt;
转义为&lt;
。我的代码:
tpl, _ := template.New("text").Parse(`range .Users <@.> end`)
var buffer bytes.Buffer
tpl.Execute(&buffer, struct
Users []string
Users: []string"user1", "user2",
)
fmt.Println(buffer.String())
预期:
<@user1> <@user2>
输出:
<@user1> <@user2>
如何解决这个问题?
【问题讨论】:
使用 text/template 包而不是 html/template 包。 哦,谢谢,goland自动导入html/template
包,改成text/template
解决了。
【参考方案1】:
如果您想这样做,请使用文本/模板。以下是文档的一部分,以便更好地理解每个文档:
戈多克:html/template:
此包包装了包文本/模板,因此您可以共享其模板 API 以安全地解析和执行 HTML 模板。
tmpl, err := template.New("name").Parse(...)
// Error checking elided
err = tmpl.Execute(out, data)
如果成功,tmpl 现在将是注入安全的。否则,err 是 ErrorCode 文档中定义的错误。
HTML 模板将数据值视为应编码的纯文本,以便它们可以安全地嵌入到 HTML 文档中。转义是上下文相关的,因此动作可以出现在 javascript、CSS 和 URI 上下文中。
此包使用的安全模型假定模板作者是受信任的,而 Execute 的数据参数不是。下面提供了更多详细信息。
示例
import "text/template"
...
t, err := template.New("foo").Parse(`define "T"Hello, .!end`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
生产
Hello, <script>alert('you have been pwned')</script>!
但是 html/template 中的上下文自动转义
import "html/template"
...
t, err := template.New("foo").Parse(`define "T"Hello, .!end`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
产生安全的、转义的 HTML 输出
Hello, <script>alert('you have been pwned')</script>!
【讨论】:
以上是关于范围内的转义模板的主要内容,如果未能解决你的问题,请参考以下文章