为什么我看到ZgotmplZ在我转到HTML模板输出?(Why am I seeing Zgotmp

2019-07-19 14:28发布

当我打电话围棋模板函数输出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>

Answer 1:

“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等其他一些功能



Answer 2:

我有类似的问题<img src="{{myfunction}}">其中myfunction的返回编码的图像。

最后我解决它,而不是字符串函数返回时template.URL(mystring)



Answer 3:

您正试图输出HTML在模板/ HTML认为是不安全的(例如,一个HTML元素里面,像这样的地方:

<option {{ printSelected }}>

我找不到任何办法说服它,它是安全的(包括返回的字符串,而不是template.HTML); 我发现的唯一选择就是重写模板,在这个例子中使用布尔输出,而不是:

<option {{ if printSelected }}selected{{ end }}>


Answer 4:

最简单的方法:

import "html/template"
yourhref = template.URL(yourhref)


Answer 5:

你应该包装在串HTMLAttr ,这是专为获取尖括号之间注入文本。 每文档:

https://golang.org/pkg/html/template/#HTMLAttr

HTMLAttr封装来自可信源的HTML属性,例如, dir="ltr"

这种类型的使用存在安全风险:封装内容应该来自可信任的来源,因为它会在模板输出逐字包括在内。

type HTMLAttr string



文章来源: Why am I seeing ZgotmplZ in my Go HTML template output?