使用自述文件中的示例golang杜松子酒代码:
func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/*")
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl",
gin.H{
"foo": "bar",
})
}
}
// in template index.tmpl
<script>
{{.foo}}
</script>
// result in html
<script>
"bar"
</script>
但是如何不带引号呢?我只需要bar
和"bar"
?
答案 0 :(得分:1)
模板包实现了HTML上下文感知引擎,以提供注入安全的html。
换句话说,它知道它在script标签内执行,因此它不输出原始字符串,而是输出与js兼容的json编码的字符串。
要解决此问题,与注释建议不同的是,请将字符串设置为template.JS
的值,并且安全措施将不会尝试保护字符串。
参考 -https://golang.org/pkg/html/template/
包模板(html / template)为以下对象实现了数据驱动的模板 生成可防止代码注入的HTML输出。
使用这种类型会带来安全风险:封装的内容 应该来自受信任的来源,因为它将逐字包含在 模板输出。
package main
import (
"html/template"
"os"
)
func main() {
c := `<script>
{{.foo}}
{{.oof}}
</script>`
d := map[string]interface{}{"foo": "bar", "oof": template.JS("rab")}
template.Must(template.New("").Parse(c)).Execute(os.Stdout, d)
}