范围内的转义模板

Posted

技术标签:

【中文标题】范围内的转义模板【英文标题】: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解决了。 【参考方案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;!

【讨论】:

以上是关于范围内的转义模板的主要内容,如果未能解决你的问题,请参考以下文章

Golang 模板 - 使用模板变量作为范围循环内的全局变量

如何使用模板来规范化 0 到 1 范围内的数字?

模板小程序求小于等于N范围内的质数

模板小程序求小于等于N范围内的质数

正则表达式范围内的转义点

Django 模板:启用模板自动转义后,我是不是需要将 URL 传递给 URLEncode?