英文:
How to get rid of ZgotmplZ from html/template in Golang?
问题
我正在使用Golang进行后端开发。当我使用html/templates渲染HTML时,URL中出现了ZgotmplZ
。
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
我在服务器端使用字符串表示GitURL。这个URL是https
的。当我寻找解决方案时,有一篇博客建议使用safeURL
。所以我尝试了以下代码:
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL | safeURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
但是代码无法编译。
有人可以帮助我吗?任何建议都将非常有帮助。
英文:
I'm using Golang in backend. When I render the html using html/templates I'm getting ZgotmplZ
for URL's.
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
I'm using string for GitURL in server side. This URL is https
. When I looked for solutions some blog suggested to use safeURL
. So I tried,
{{if .UserData.GitURL}}
<li>
<a href="{{.UserData.GitURL | safeURL}}">
<i class="icon fa fa-github"></i>
</a>
</li>
{{end}}
But code didn't compile.
Could someone help me with this? Any suggestion would be really helpful.
答案1
得分: 9
ZgotmplZ
是一个特殊的值,表示你的输入无效。引用自html/template
的文档:
"ZgotmplZ"是一个特殊的值,表示在运行时不安全的内容进入了CSS或URL上下文。示例的输出将是
<img src="#ZgotmplZ">
。如果数据来自可信源,请使用内容类型来免除过滤:URL(javascript:...
)。
如果你想替换一个有效的URL文本,不需要像safeURL
函数那样特殊处理。如果你的模板执行结果是类似"#ZgotmplZ"
的值,那意味着你想要插入的URL是无效的。
看看这个例子:
t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t.Execute(os.Stdout, "http://google.com")
t.Execute(os.Stdout, "badhttp://google.com")
输出:
<a href="http://google.com"></a>
<a href="#ZgotmplZ"></a>
如果你想使用一个URL而不进行转义,可以使用template.URL
类型的值。注意,这种情况下,即使提供的值不是一个有效的URL,也会直接使用提供的值。
safeURL
不是一种魔法或预定义的函数,你不能在模板中直接使用它。但是你可以注册自己的自定义函数,该函数返回一个string
类型的URL参数作为template.URL
类型的值:
t2 := template.Must(template.New("").Funcs(template.FuncMap{
"safeURL": func(u string) template.URL { return template.URL(u) },
}).Parse(`<a href="{{. | safeURL}}"></a>` + "\n"))
t2.Execute(os.Stdout, "http://google.com")
t2.Execute(os.Stdout, "badhttp://google.com")
输出:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
**注意:**如果你能直接将template.URL
值传递给模板执行,就不需要注册和使用safeURL()
自定义函数:
t3 := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t3.Execute(os.Stdout, template.URL("http://google.com"))
t3.Execute(os.Stdout, template.URL("badhttp://google.com"))
输出:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
在Go Playground上尝试一下这些代码。
英文:
ZgotmplZ
is a special value indicating your input was invalid. Quoting from the doc of html/template
:
> "ZgotmplZ" is a special value that indicates that unsafe content reached a
> CSS or URL context at runtime. The output of the example will be
> <img src="#ZgotmplZ">
> If the data comes from a trusted source, use content types to exempt it
> from filtering: URL(javascript:...
).
If you want to substitute a valid url text, nothing special like like safeURL
function is needed. If your template execution results in a value like "#ZgotmplZ"
, that means the URL you wanted to insert is invalid.
See this example:
t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t.Execute(os.Stdout, "http://google.com")
t.Execute(os.Stdout, "badhttp://google.com")
Output:
<a href="http://google.com"></a>
<a href="#ZgotmplZ"></a>
You may use a value of type template.URL
if you want to use a URL as-is without escaping. Note that in this case the provided value will be used as-is even if it is not a valid URL.
safeURL
is not some kind of magic or predeclared function that you may use in templates. But you may register your own custom function which returns a string
url parameter as a value of type template.URL
:
t2 := template.Must(template.New("").Funcs(template.FuncMap{
"safeURL": func(u string) template.URL { return template.URL(u) },
}).Parse(`<a href="{{. | safeURL}}"></a>` + "\n"))
t2.Execute(os.Stdout, "http://google.com")
t2.Execute(os.Stdout, "badhttp://google.com")
Output:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
Note: If you are able to pass in a template.URL
value directly to the template execution, you do not need to register and use a safeURL()
custom function:
t3 := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t3.Execute(os.Stdout, template.URL("http://google.com"))
t3.Execute(os.Stdout, template.URL("badhttp://google.com"))
Output:
<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>
Try these on the Go Playground.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论