How do you escape raw HTML in Go?

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

How do you escape raw HTML in Go?

问题

我已经成功使用以下代码输出文本:

fmt.Fprintf(w, "<p>some text</p>")

但是这样会直接输出 HTML 标签。你想知道如何安全地输出文本,使其可以像在 PHP 中使用 echo 一样包含在 HTML 中吗?

英文:

I have managed to output text using the following line:

fmt.Fprintf(w, &quot;&lt;p&gt;some text&lt;/p&gt;&quot;)

But this will literally output the HTML tags. How do you output it so it can safely be included in HTML like you would with echo in PHP?

答案1

得分: 3

fmt.Fprintf()没有HTML语法的知识:它输出未经转义的原始数据(可能会进行一些格式化,但不是转义)。

但是你的使用方式不正确:它的第二个参数是格式化字符串,所以你应该这样调用它:

fmt.Fprintf(w, "%s", "<p>some text</p>")

否则,如果你的文本包含一些特定于格式的特殊字符,你将无法得到预期的结果。

你想要的是转义HTML代码,以便可以安全地包含在HTML文档/页面中。为此,你可以使用html/template包提供的出色支持,该包提供了一个强大的模板引擎,其中自动转义功能只是其中的一个特性。

下面是一个简单的示例,演示如何实现你想要的效果:

w := os.Stdout

text := "<p>some text</p>"
fmt.Fprintf(w, "%s\n", text)

tt := `{{.}}`
t := template.Must(template.New("test").Parse(tt))
t.Execute(w, text)

输出结果(在Go Playground上尝试):

<p>some text</p>
&lt;p&gt;some text&lt;/p&gt;

另外请注意,如果你只想转义一些HTML代码,可以使用template.HTMLEscaper()函数:

fmt.Println(template.HTMLEscaper(text))

输出结果:

&lt;p&gt;some text&lt;/p&gt;
英文:

fmt.Fprintf() has no knowledge of HTML syntax: it outputs raw data without escaping it (it may do some formatting but that is not escaping).

You don't use it correctly though: its second parameter is a format string, so you should call it rather like this:

fmt.Fprintf(w, &quot;%s&quot;, &quot;&lt;p&gt;some text&lt;/p&gt;&quot;)

Else if your text contains some format-specific special characters, you will not get the expected result.

What you want is to escape HTML code so it can be safely included in HTML documents/pages. For that you get excellent support from the html/template package which provides you a powerful template engine where automatic escaping functionality being just one feature.

Here's a simple example how to achieve what you want:

w := os.Stdout

text := &quot;&lt;p&gt;some text&lt;/p&gt;&quot;
fmt.Fprintf(w, &quot;%s\n&quot;, text)

tt := `{{.}}`
t := template.Must(template.New(&quot;test&quot;).Parse(tt))
t.Execute(w, text)

Output (try it on the Go Playground):

&lt;p&gt;some text&lt;/p&gt;
&amp;lt;p&amp;gt;some text&amp;lt;/p&amp;gt;

Also note that if you only want to escape some HTML code, there is a template.HTMLEscaper() function for that:

fmt.Println(template.HTMLEscaper(text))

Output:

&amp;lt;p&amp;gt;some text&amp;lt;/p&amp;gt;

答案2

得分: 1

这里的问题不是我使用的输出方法。实际上,浏览器将其视为纯文本而不是HTML。因此,你需要告诉浏览器它是HTML。

w.Header().Set("Content-Type", "text/html")
这个函数只是将内容类型设置为HTML。

英文:

The problem here was not the output method that i used. Atchaully, the browser is seeing it as plain text instead of html. Therefore you need to tell the browser that it is html.

 w.Header().Set(&quot;Content-Type&quot;, &quot;text/html&quot;)

This function simply sets the content type to html.

huangapple
  • 本文由 发表于 2015年7月2日 14:52:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/31177428.html
匿名

发表评论

匿名网友

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

确定