Golang Go语言中 html/template 自动转码模板内容

发布于 1周前 作者 sinazl 来自 Go语言

模板代码如下:

{{- define "common/web/atom"}}
<?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://www.w3.org/2005/Atom">
&lt;/feed&gt;

{{end}}

很简单的一个代码,主要是想用来实现一个 atom 服务器,返回浏览器 atom.xml 文件

但是调用 ExecuteTemplate 方法后,变成了这个样子:


&lt;?xml version=“1.0” encoding=“utf-8”?> <feed xmlns=“http://www.w3.org/2005/Atom”>

&lt;/feed&gt;

尖括号"<" 变成了 <

很奇怪的一个问题。我知道 Go 的 html/template 会对一些输入进行转码,避免把用户的输入生成到 html 。

但是为什么会把我的模板里面的也进行转码了呢


Golang Go语言中 html/template 自动转码模板内容

更多关于Golang Go语言中 html/template 自动转码模板内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

求助大家,这个问题困扰了我好几天了

更多关于Golang Go语言中 html/template 自动转码模板内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


html/template 自带防注入,会转义内容。

你可能要用它的兄弟 text/template ,注意不要用它直接处理用户输入。

是尖括号 “<” 变成了 &lt

使用 text/template

是的,我知道 html/template 会转义内容,防止注入。但是我不理解的是,为什么把我在模板里定义的内容也给转义了,这不是模板的输入啊。html/template 的文档里应该写着只会转义模板的输入

因为你这个“<?xml”是 xml 的 header ,不符合 html 语法。要么你不要使用 html/template 去处理,要么 execute 之后手动添加

换成:
{{- printf “<?xml version=“1.0” encoding=“utf-8” standalone=“yes”?>” | safeHTML }}

在Golang中,html/template 包用于安全地生成HTML内容,它会自动对模板中的数据进行HTML转码,以防止跨站脚本攻击(XSS)。这种自动转码特性是模板引擎的一个重要安全特性。

默认情况下,当你在模板中插入变量时,html/template 会自动将这些变量的内容进行HTML转码。这意味着诸如 <, >, & 等特殊字符会被转换成对应的HTML实体,如 &lt;, &gt;, &amp;,从而避免这些字符被浏览器解释为HTML标签或实体。

例如,假设你有一个模板文件 template.html,内容如下:

<html>
<body>
    <p>{{.Content}}</p>
</body>
</html>

如果你的Go代码传递了一个包含 <script>alert('XSS');</script> 的字符串给 .Content,模板引擎会自动将其转码为 &lt;script&gt;alert(&#39;XSS&#39;);&lt;/script&gt;,这样浏览器在渲染时就不会执行这段脚本了。

如果你确实需要在模板中插入原始的HTML内容(虽然这通常不推荐,因为它可能带来安全风险),你可以使用 template.HTML 类型。这告诉模板引擎这部分内容是安全的,不需要转码。但请务必确保你插入的HTML内容是安全的,避免引入XSS漏洞。

总之,html/template 的自动转码特性是保护Web应用免受XSS攻击的重要防线。在大多数情况下,你应该依赖这一特性来确保你的HTML输出是安全的。

回到顶部