92.go展示HTML内容是否转义,由前端掌控

在开发web的时候,几乎必然会用到标准库 html/template。在默认的情况下,渲染模板时,为了安全等原因会将字符串中的特殊符号进行转义。比如:html代码。
下面定义一个简单的模板。

<body>
{{.Content}}
</body>

默认情况下,对模板进行渲染是这样的。

dataShow := struct {
 Content    string
}{}
 dataShow.Content = "<p> Love U,CoFox.Com </p>"

files, err := template.ParseFiles("./cofox.html")
if err != nil {
  ...
}
err1 := files.Execute(writer, dataShow)

正常情况下会显示成这样。

<body>
&lt;p&gt; Love U,CoFox.Com &lt;/p&gt;
</body>

为了避免这种情况,通常在go代码中,把字段 Content 的类型固定的设置为 template.HTML。

dataShow := struct {
 Content    template.HTML
}{}

这种做法,实现简单,却非常不灵活。

我们更希望把前端的表现形式交由前端代码来控制。

为了更加灵活,我们可以采用:

注册自定义转义处理函

可以使用模版的 Funcs() 方法注册自定义函数。
为了实现避免转义HTML文本的效果,我们先要定义一个函数用于处理将字符串转为template.HTML类型。例如我们定一个名为 CoFoxTemplateFieldUseHTML 的函数:

// CoFox不转义HTML(直接使用HTML代码)
func CoFoxTemplateFieldUseHTML(s string) template.HTML {
    return template.HTML(s)
}

然后,我们需要使用 Funcs() 将其注册到模版中。需要注意,注册自定义函数需要在调用 Parse()ParseFiles() 前进行。在注册时我们需要定义一个函数标识符,并在模版文本中使用。在下面例子中我们使用了名为 showHTML 的函数标识符。

dataShow := struct {
 Content    string
}{}
 dataShow.Content = "<p> Love U,CoFox.Com </p>"
files, err := template.New("cofox").Funcs(template.FuncMap{"showHTML": CoFoxTemplateFieldUseHTML}).ParseFiles("./cofox.html")
if err != nil {
  ...
}
err1 := files.Execute(writer, dataShow)

模板HTML

<!doctype html>
<html lang="en">
<body>
{{showHTML .Content }}
<br>
{{.Content }}
</body>
</html>

我们将得到这样的结果

&lt;p&gt; Love U,CoFox.Com &lt;/p&gt;
<br>
<p> Love U,CoFox.Com </p>

注意:

html/template同样也提供了例如template.JStemplate.CSS等类型,用于Javascript或是CSS的处理。
html/template 包默认进行转义很大程度上避免了一些安全性的问题,例如潜在的XSS攻击等。在实际使用中,进行“不转义”处理后将存在安全性方面的风险,对于风险较高的使用场合需要另外考虑这方面的处理方案。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • go中如何让html/template不转义html标签(实现前端htm能够解析服务器返回的带html标签的字符串...
    五岁小孩阅读 2,210评论 0 0
  • Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。 net/http介绍 Go语言内...
    雪上霜阅读 691评论 0 0
  • 以下内容是我在学习和研究Go时,对Go的特性、重点和注意事项的提取、精练和总结,还有一些学习笔记(注:部分笔记是摘...
    科研者阅读 628评论 0 1
  • html html包提供了用于转义和解转义HTML文本的函数。 func EscapeString EscapeS...
    DevilRoshan阅读 1,234评论 0 0
  • 一、模板和模板引擎 在基于MVC的web架构中,我们常常将不变的部分提出成为模板,可变部分通过后端程序提供数据,借...
    Every_dawn阅读 4,079评论 0 0