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上下文中。

键入的字符串

默认情况下,此包假定所有管道都生成纯文本字符串。它添加了必要的转义管道阶段,以便在正确的上下文中正确安全地嵌入纯文本字符串。

如果数据值不是纯文本,则可以通过使用其类型对其进行标记来确保它不会过度转义。

来自content.go的HTML,JS,URL和其他类型可以携带免于转义的安全内容。

模板

Hello, {{.}}!

可以调用

tmpl.Execute(out, template.HTML(`World`))

来生成

Hello, World!

而不是

Hello, <b>World<b>!

如果{{.}}是常规字符串,则会生成。

安全模型

https://rawgit.com/mikesamuel/sanitized-jquery-templates/trunk/safetemplate.html#problem_definition定义此包使用的“safe”。

这个包假定模板作者是可信的,Execute的数据参数不是,并试图在不受信任的数据面前保留下面的属性:

结构保留属性:“......当模板作者以安全模板语言编写HTML标记时,浏览器会将输出的相应部分解释为标记,而不管不受信任数据的值如何,对于其他结构(如属性边界和JS和CSS字符串边界。“

代码效果属性:“...只有模板作者指定的代码才能运行,因为将模板输出注入到页面中,模板作者指定的所有代码都应该运行相同的结果。”

Least Surprise Property:“熟悉HTML,CSS 和 JavaScript 的开发人员(或代码审查员),他们知道发生上下文自动转移应该能够查看{ {.}} 并正确推断出正在进行的清理。”

示例

package mainimport ("html/template""log""os")func main() {const tpl = `

html>

{{.Title}}

{{range .Items}}

{{ . }}

{{else}}

no rows

{{end}}

`

check := func(err error) {if err != nil {

log.Fatal(err)}}

t, err := template.New("webpage").Parse(tpl)check(err)

data := struct {

Title string

Items []string}{

Title: "My page",

Items: []string{"My photos","My blog",},}

err = t.Execute(os.Stdout, data)check(err)

noItems := struct {

Title string

Items []string}{

Title: "My another page",

Items: []string{},}

err = t.Execute(os.Stdout, noItems)check(err)}

示例(Autoescaping)

package mainimport ("html/template""log""os")func main() {

check := func(err error) {if err != nil {

log.Fatal(err)}}

t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)check(err)

err = t.ExecuteTemplate(os.Stdout, "T", "")check(err)}

示例(Escape)

package mainimport ("fmt""html/template""os")func main() {const s = `"Fran & Freddie's Diner" `

v := []interface{}{`"Fran & Freddie's Diner"`, ' ', ``}

fmt.Println(template.HTMLEscapeString(s))

template.HTMLEscape(os.Stdout, []byte(s))

fmt.Fprintln(os.Stdout, "")

fmt.Println(template.HTMLEscaper(v...))

fmt.Println(template.JSEscapeString(s))

template.JSEscape(os.Stdout, []byte(s))

fmt.Fprintln(os.Stdout, "")

fmt.Println(template.JSEscaper(v...))

fmt.Println(template.URLQueryEscaper(v...))}

索引

func HTMLEscape(w io.Writer, b []byte)

func HTMLEscapeString(s string) string

func HTMLEscaper(args ...interface{}) string

func IsTrue(val interface{}) (truth, ok bool)

func JSEscape(w io.Writer, b []byte)

func JSEscapeString(s string) string

func JSEscaper(args ...interface{}) string

func URLQueryEscaper(args ...interface{}) string

type CSS

type Error

func (e *Error) Error() string

type ErrorCode

type FuncMap

type HTML

type HTMLAttr

type JS

type JSStr

type Template

func Must(t *Template, err error) *Template

func New(name string) *Template

func ParseFiles(filenames ...string) (*Template, error)

func ParseGlob(pattern string) (*Template, error)

func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error)

func (t *Template) Clone() (*Template, error)

func (t *Template) DefinedTemplates() string

func (t *Template) Delims(left, right string) *Template

func (t *Template) Execute(wr io.Writer, data interface{}) error

func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error

func (t *Template) Funcs(funcMap FuncMap) *Template

func (t *Template) Lookup(name string) *Template

func (t *Template) Name() string

func (t *Template) New(name string) *Template

func (t *Template) Option(opt ...string) *Template

func (t *Template) Parse(text string) (*Template, error)

func (t *Template) ParseFiles(filenames ...string) (*Template, error)

func (t *Template) ParseGlob(pattern string) (*Template, error)

func (t *Template) Templates() []*Template

type URL

示例

Package Template (Block) Template (Glob) Template (Helpers) Template (Parsefiles) Template (Share) Package (Autoescaping) Package (Escape)

包文件

attr.go content.go context.go css.go doc.go error.go escape.go html.go js.go template.go transition.go url.go

func HTMLEscape

func HTMLEscape(w io.Writer, b []byte)

HTMLEscape 写入到明文数据 b 的转义HTML 等价物中。

func HTMLEscapeString

func HTMLEscapeString(s string) string

HTMLEscapeString 返回纯文本数据的转义 HTML 等价物。

func HTMLEscaper

func HTMLEscaper(args ...interface{}) string

HTMLEscaper 返回其参数文本表示的转义 HTML 等价物。

func IsTrue

func IsTrue(val interface{}) (truth, ok bool)

IsTrue报告该值是否为'true',意味着它的类型不为零,以及该值是否具有有意义的真值。这是 if 和其他此类行为所使用的真相的定义。

func JSEscape

func JSEscape(w io.Writer, b []byte)

JSEscape写入 w 的纯文本数据 b 的逃逸 JavaScript 等价物。

func JSEscapeString

func JSEscapeString(s string) string

JSEscapeString 返回纯文本数据的转义 JavaScript 等价物。

func JSEscaper

func JSEscaper(args ...interface{}) string

JSEscaper 返回其参数的文本表示的转义 JavaScript 等价物。

func URLQueryEscaper

func URLQueryEscaper(args ...interface{}) string

URLQueryEscape r 以适合于嵌入到 URL 查询中的形式返回其参数的文本表示的转义值。

type CSS

CSS封装了与以下任何匹配的已知安全内容:

1. CSS3样式表的制作,例如`p {color:purple}`。2. CSS3规则生成,例如`a [href =〜“https:”]。foo #bar`。3. CSS3声明制作,如`color:red; 保证金:2px`。4. CSS3值的产生,例如`rgba(0,0,255,127)`。

请参阅http://www.w3.org/TR/css3-syntax/#parsing和https://web.archive.org/web/20090211114933/http://w3.org/TR/css3-syntax#style

使用此类型会带来安全风险:封装内容应来自可信来源,因为它将逐字包含在模板输出中。

type CSS string

type Error

错误描述了模板转义期间遇到的问题。

type Error struct {        // ErrorCode describes the kind of error.

ErrorCode ErrorCode        // Node is the node that caused the problem, if known.        // If not nil, it overrides Name and Line.

Node parse.Node        // Name is the name of the template in which the error was encountered.

Name string        // Line is the line number of the error in the template source or 0.

Line int        // Description is a human-readable description of the problem.

Description string}

func (*Error) Error

func (e *Error) Error() string

type ErrorCode

ErrorCode 是一种错误的代码。

type ErrorCode int

我们为转义模板时显示的每个错误定义代码,但转义模板也可能在运行时失败。

输出:“ZgotmplZ”示例:

where {{.X}} evaluates to `javascript:...`

讨论:

"ZgotmplZ" is a special value that indicates that unsafe content reached a

CSS or URL context at runtime. The output of the example will be  If the data comes from a trusted source, use content types to exempt itfrom filtering: URL(`javascript:...`).

const (        // OK indicates the lack of an error.

OK ErrorCode = iota        // ErrAmbigContext: "... appears in an ambiguous context within a URL"        // Example:        //           // Discussion:        //   {{.X}} is in an ambiguous URL context since, depending on {{.C}},        //  it may be either a URL suffix or a query parameter.        //   Moving {{.X}} into the condition removes the ambiguity:        //

ErrAmbigContext        // ErrBadHTML: "expected space, attr name, or end of tag, but got ...",        //   "... in unquoted attr", "... in attribute name"        // Example:        //           //           //           //

ErrBadHTML        // ErrBranchEnd: "{{if}} branches end in different contexts"        // Example:        //   {{if .C}}

html 文档模板,html/template(模板)相关推荐

  1. wps文档漫游删除_WPS自带的文档漫游和在线模板怎么关闭?

    也可以直接在注册表编辑器选择编辑查找查找目标中输入roaminghomepageguidedtag. 按确定后,(如第四幅图) 如果希望再次显示文档漫游,关闭文档, 方法一:在cmd(命令提示符)中输 ...

  2. SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)

    保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码. 数据库表 CREATE TA ...

  3. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  4. 用Axure制作一个PRD文档(结尾分享模板)

    经常有小伙伴在微信上问我axure版本的PRD写法,今天就系统的跟大家分享一下,如何用axure制作一个完善的PRD,废话不多说,直接开始干货分享. 1.修改记录 修改记录主要记录你对原型的修改内容, ...

  5. WPS 去掉自动打开的文档漫游和在线模板

    关闭文档漫游  在cmd(命令提示符)中输入regedit.exe回车,将弹出"注册表编辑器",选择HKEY_CURRENT_USER>>Software>> ...

  6. 【JEECG技术文档】online自定义模板的使用

    一. 业务背景 客户需要快速开发一个信息采集的功能模块,并使用已规划好的页面,实现个性化页面展示,使用标准左右布局的Table或DIV风格的页面表现力不强,不能满足客户的个性化页面需要 二. 需求 1 ...

  7. 计算机二级模板文档,计算机二级教案模板.doc

    教案首页 第 8 次课 授课时间:2006 年10月24日 课程名称 <计算机应用基础> 年级 2005 专业.层次 护理专业本科 授课教师 刘帮涛 职称 讲师 课型(大.小) 大 学时 ...

  8. 黑马博客实战项目中 Mongoose 错误-RangeError: Maximum call stack size exceeded,返回的文档过大导致模板引擎无法渲染的问题

    黑马博客实战项目中遇到的bug,过程写得很简略仅供自己复习参考,解决办法在文末加粗了,可以直接跳到文末查看 只是暂时解决了问题,但对问题的本质还没有清晰认识,希望有大佬指教. 只要加入populate ...

  9. 软件单元测试文档,软件单元测试报告_模板.doc

    . . PAGE word完美格式 XXXXXX 软件单元测试报告 SRIJS-T0-/V0.0 XXXX年XX月 . . word完美格式 姓名 签名 日期 作者: 审核: 批准: 序号 修订内容简 ...

  10. android 视图模板,Android Template(模板) 编写(一)

    转载请注明出处:http://blog.csdn.net/zhaodai11?viewmode=contents 当我们在使用AndroidStudio新建工程,模块或者类时,其实AndroidStu ...

最新文章

  1. (三)WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(核心)
  2. git push origin master和git push有什么区别?
  3. python collections模块(数据结构常用模块)计数器Counter 双向队列deque 默认字典defaultdict 有序字典OrderedDict 可命名元组namedtuple
  4. Source Insight编辑器配置
  5. m40型工业机器人_工业机器人选型的9大参数
  6. 怎么才能在百度上看到自己发布的博文?
  7. 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
  8. 大数据Hadoop(一):​​​​​​​Hadoop介绍
  9. 电子信息专业实习报告与总结
  10. Windows XP 下如何用 Modem 发传真
  11. easyui设置html样式,easyui checkbox
  12. 老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚
  13. DAY20:尚学堂高琪JAVA(156~164)其他流及 IO的设计模式
  14. 时间(格林尼治时间/协调世界时/世界时间)
  15. Win10开机任务栏卡死
  16. 读书笔记丨《数据产品经理修炼手册:从零基础到大数据产品实践》丨DAY4
  17. python4(循环)
  18. 由“西游记”的唐僧扫塔想到的
  19. Mat结构及其它数据类型详解
  20. Android M应用启动流程分析

热门文章

  1. VPS自己搭建frp/frps内网穿透实现外网访问局域网设备
  2. 汽车租赁服务微信小程序制作开发
  3. layui select下拉框(弹窗中的)
  4. 向量和矩阵的 1范数、2范数
  5. echarts-去掉垂直网格线
  6. T-Mobile CEO为视频节流辩护 声称他支持网络中立
  7. 推荐系列(三):协同过滤
  8. vue3图片头像裁剪上传
  9. 南北桥的作用一功能和特点
  10. 中科易安8周年,与你相约联网智能门锁