text/template与html/template的区别

text/template 是将内容都已text文本格式返回。

html/tempalte针对的是需要返回HTML内容的场景。
在模板渲染过程中会对一些有风险的内容进行转义,以此来防范跨站脚本攻击。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>Demo</title>
</head>
<body>
    {
     {
     .}}
</body>
</html>

当传入一段JS代码并使用html/template去渲染该文件,会在页面上显示出转义后的JS内容。 这就是html/template为我们做的事。
但当有人恶意传入一个死循环的JS内容或一些占用资源比较大的内容,将会造成危险。

但是我们如果相信用户输入的内容,不想转义的话,可以自行编写一个safe函数,手动返回一个template.HTML类型的内容。示例如下:

func xss(w http.ResponseWriter, r *http.Request){
     
	tmpl,err := template.New("xss.tmpl").Funcs(template.FuncMap{
     
		"safe": func(s string)template.HTML {
     
			return template.HTML(s)
		},
	}).ParseFiles("./xss.tmpl")
	if err != nil {
     
		fmt.Println("create template failed, err:", err)
		return
	}
	jsStr := ``
	err = tmpl.Execute(w, jsStr)
	if err != nil {
     
		fmt.Println(err)
	}
}

这样我们只需要在模板文件不需要转义的内容后面使用我们定义好的safe函数就可以了。

{
     {
      . | safe }}

你可能感兴趣的:(go)