import "html/template"
概述
索引
示例
概观
模板包(html/template)实现了数据驱动的模板,以便在代码注入过程中安全地生成HTML输出。它提供了与包文本/模板相同的接口,只要输出是HTML,就应该使用它来代替文本/模板。
这里的文档侧重于包的安全特性。有关如何自行编写模板的信息,请参阅文本/模板的文档。
介绍
该软件包包装文本/模板,以便您可以共享其模板API以安全地解析和执行HTML模板。
tmpl, err := template.New("name").Parse(...)// 错误检查已删除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", "")
产生
Hello, !
但在HTML /模板中的上下文自动转义
import "html/template"...t, err := template.New("foo").Parse(`{ {define "T"}}Hello, { {.}}!{ {end}}`)err = t.ExecuteTemplate(out, "T", "")
产生安全的、转义过的HTML输出
Hello, <script>alert('you have been pwned')</script>!
上下文
该软件包可以理解 HTML,CSS,JavaScript和URI 。它给每个简单的操作流水线增加了清理功能,所以给出了摘录
{ {.}}
在解析时,每个 { {.}} 都会被覆盖,以根据需要添加转义函数。在这种情况下,它变成了
{ {. | htmlescaper}}
urlescaper,attrescaper和htmlescaper 是内部转义函数的别名。
错误
有关详细信息,请参阅ErrorCode的文档。
A fuller picture
在第一次阅读时可以跳过此包评论的其余部分;它包含了解转义上下文和错误消息所需的详细信息。大多数用户不需要了解这些细节。
上下文
假设 { {.}} 是O'Reilly: How are you?,下表显示了 { {.}} 在左侧上下文中使用时的显示方式。
Context { {.}} After{ {.}} O'Reilly: How are <i>you</i>? O'Reilly: How are you? O'Reilly: How are %3ci%3eyou%3c/i%3e? O'Reilly%3a%20How%20are%3ci%3e...%3f O\x27Reilly: How are \x3ci\x3eyou...? "O\x27Reilly: How are \x3ci\x3eyou...?" O\x27Reilly: How are \x3ci\x3eyou...\x3f
如果在不安全的上下文中使用,则可能会过滤掉该值:
Context { {.}} After #ZgotmplZ
因为“O'Reilly:”不是像“http:”这样的允许协议。
如果{ {.}}是无关紧要的词left,那么它可以更广泛地出现,
Context { {.}} After{ {.}} left left left left left left left left left left
非字符串值可以在JavaScript上下文中使用。如果是
struct{A,B string}{ "foo", "bar" }
在转义模板中
然后模板输出是
请参阅包 json 以了解如何封装非字符串内容以嵌入JavaScript上下文中。
键入的字符串
默认情况下,此包假定所有管道都生成纯文本字符串。它添加了必要的转义管道阶段,以便在正确的上下文中正确安全地嵌入纯文本字符串。
如果数据值不是纯文