go - 范围内的转义模板

标签 go go-templates html-escape-characters

我想打印用户列表,例如:<@user1> <@user2> ,这是我公司内部的内部格式,但是golang模板总是转义<&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>

输出:

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

如何解决这个问题?

最佳答案

如果您想这样做,请使用文本/模板。以下是为了更好地理解每个文档的一部分:

戈多克:html/template:

此包包装了包文本/模板,以便您可以共享其模板 API 来安全地解析和执行 HTML 模板。

tmpl, err := template.New("name").Parse(...)
// Error checking elided
err = tmpl.Execute(out, data)

如果成功,tmpl 现在将是注入(inject)安全的。否则,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;!

关于go - 范围内的转义模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64868612/

相关文章:

java - 解码时处理 JAXB 中的转义字符

java - 为什么我应该使用 gRPC 而不是 IPC/Simple websocket?

variables - 变量的不同行为和函数的返回值

pointers - 戈朗 : How to append pointer to slice to slice?

jquery - 只要发送的文本包含 "<",就不会从 $.ajax POST 调用操作方法

html - 解码特殊字符 "ì"

python - Go 真的能比 Python 快那么多吗?

go - 存储在 map 中的 Html 模板在第一次调用时崩溃

templates - 使用多个管道参数调用模板

go - 模板范围中的最后一项