当我打电话围棋模板函数输出HTML,它显示ZgotmplZ
。
示例代码:
http://play.golang.org/p/tfuJa_pFkm
package main
import (
"html/template"
"os"
)
func main() {
funcMap := template.FuncMap{
"printSelected": func(s string) string {
if s == "test" {
return `selected="selected"`
}
return ""
},
"safe": func(s string) template.HTML {
return template.HTML(s)
},
}
template.Must(template.New("Template").Funcs(funcMap).Parse(`
<option {{ printSelected "test" }} {{ printSelected "test" | safe }} >test</option>
`)).Execute(os.Stdout, nil)
}
输出:
<option ZgotmplZ ZgotmplZ >test</option>
“ZgotmplZ”是一个特殊值,表示不安全的含量达到在运行时CSS或URL上下文。 该例子的输出将是:
<img src="#ZgotmplZ">
您可以添加一个安全和attR功能模板funcMap:
包主
import (
"html/template"
"os"
)
func main() {
funcMap := template.FuncMap{
"attr":func(s string) template.HTMLAttr{
return template.HTMLAttr(s)
},
"safe": func(s string) template.HTML {
return template.HTML(s)
},
}
template.Must(template.New("Template").Funcs(funcMap).Parse(`
<option {{ .attr |attr }} >test</option>
{{.html|safe}}
`)).Execute(os.Stdout, map[string]string{"attr":`selected="selected"`,"html":`<option selected="selected">option</option>`})
}
输出将如下所示:
<option selected="selected" >test</option>
<option selected="selected">option</option>
您可能需要确定哪些可以字符串转换为template.CSS,template.JS,template.JSStr,template.URL等其他一些功能
我有类似的问题<img src="{{myfunction}}">
其中myfunction的返回编码的图像。
最后我解决它,而不是字符串函数返回时template.URL(mystring)
。
您正试图输出HTML在模板/ HTML认为是不安全的(例如,一个HTML元素里面,像这样的地方:
<option {{ printSelected }}>
我找不到任何办法说服它,它是安全的(包括返回的字符串,而不是template.HTML); 我发现的唯一选择就是重写模板,在这个例子中使用布尔输出,而不是:
<option {{ if printSelected }}selected{{ end }}>
最简单的方法:
import "html/template"
yourhref = template.URL(yourhref)
你应该包装在串HTMLAttr
,这是专为获取尖括号之间注入文本。 每文档:
https://golang.org/pkg/html/template/#HTMLAttr
HTMLAttr封装来自可信源的HTML属性,例如, dir="ltr"
。
这种类型的使用存在安全风险:封装内容应该来自可信任的来源,因为它会在模板输出逐字包括在内。
type HTMLAttr string