【问题标题】:escape template in range范围内的转义模板
【发布时间】:2021-02-28 06:38:49
【问题描述】:

我想打印用户列表,如:<@user1> <@user2>,这是我公司内部的一种内部格式,但 golang 模板总是将< 转义为<。我的代码:

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>

输出:

 &lt;@user1>  &lt;@user2> 

如何解决这个问题?

【问题讨论】:

  • 使用 text/template 包而不是 html/template 包。
  • 哦,谢谢,goland自动导入html/template包,改成text/template解决了。

标签: go go-templates html-escape-characters


【解决方案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, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多