如何在Golang中从html/template中去除ZgotmplZ?

huangapple go评论92阅读模式
英文:

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}}
&lt;li&gt;
  &lt;a href=&quot;{{.UserData.GitURL}}&quot;&gt;
    &lt;i class=&quot;icon fa fa-github&quot;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/li&gt;
{{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}}
&lt;li&gt;
  &lt;a href=&quot;{{.UserData.GitURL | safeURL}}&quot;&gt;
    &lt;i class=&quot;icon fa fa-github&quot;&gt;&lt;/i&gt;
  &lt;/a&gt;
&lt;/li&gt;
{{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 &quot;#ZgotmplZ&quot;, that means the URL you wanted to insert is invalid.

See this example:

t := template.Must(template.New(&quot;&quot;).Parse(`&lt;a href=&quot;{{.}}&quot;&gt;&lt;/a&gt;` + &quot;\n&quot;))
t.Execute(os.Stdout, &quot;http://google.com&quot;)
t.Execute(os.Stdout, &quot;badhttp://google.com&quot;)

Output:

&lt;a href=&quot;http://google.com&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;#ZgotmplZ&quot;&gt;&lt;/a&gt;

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(&quot;&quot;).Funcs(template.FuncMap{
	&quot;safeURL&quot;: func(u string) template.URL { return template.URL(u) },
}).Parse(`&lt;a href=&quot;{{. | safeURL}}&quot;&gt;&lt;/a&gt;` + &quot;\n&quot;))
t2.Execute(os.Stdout, &quot;http://google.com&quot;)
t2.Execute(os.Stdout, &quot;badhttp://google.com&quot;)

Output:

&lt;a href=&quot;http://google.com&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;badhttp://google.com&quot;&gt;&lt;/a&gt;

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(&quot;&quot;).Parse(`&lt;a href=&quot;{{.}}&quot;&gt;&lt;/a&gt;` + &quot;\n&quot;))
t3.Execute(os.Stdout, template.URL(&quot;http://google.com&quot;))
t3.Execute(os.Stdout, template.URL(&quot;badhttp://google.com&quot;))

Output:

&lt;a href=&quot;http://google.com&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;badhttp://google.com&quot;&gt;&lt;/a&gt;

Try these on the Go Playground.

huangapple
  • 本文由 发表于 2016年4月3日 15:14:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/36382624.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定