Golang Go语言中 html/template 自动转码模板内容
模板代码如下:
{{- define "common/web/atom"}}
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
</feed>
{{end}}
很简单的一个代码,主要是想用来实现一个 atom 服务器,返回浏览器 atom.xml 文件
但是调用 ExecuteTemplate 方法后,变成了这个样子:
<?xml version=“1.0” encoding=“utf-8”?>
<feed xmlns=“http://www.w3.org/2005/Atom”>
</feed>
尖括号"<" 变成了 <
很奇怪的一个问题。我知道 Go 的 html/template 会对一些输入进行转码,避免把用户的输入生成到 html 。
但是为什么会把我的模板里面的也进行转码了呢
Golang Go语言中 html/template 自动转码模板内容
更多关于Golang Go语言中 html/template 自动转码模板内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
求助大家,这个问题困扰了我好几天了
更多关于Golang Go语言中 html/template 自动转码模板内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
html/template 自带防注入,会转义内容。
你可能要用它的兄弟 text/template ,注意不要用它直接处理用户输入。
是尖括号 “<” 变成了 <
使用 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实体,如 <
, >
, &
,从而避免这些字符被浏览器解释为HTML标签或实体。
例如,假设你有一个模板文件 template.html
,内容如下:
<html>
<body>
<p>{{.Content}}</p>
</body>
</html>
如果你的Go代码传递了一个包含 <script>alert('XSS');</script>
的字符串给 .Content
,模板引擎会自动将其转码为 <script>alert('XSS');</script>
,这样浏览器在渲染时就不会执行这段脚本了。
如果你确实需要在模板中插入原始的HTML内容(虽然这通常不推荐,因为它可能带来安全风险),你可以使用 template.HTML
类型。这告诉模板引擎这部分内容是安全的,不需要转码。但请务必确保你插入的HTML内容是安全的,避免引入XSS漏洞。
总之,html/template
的自动转码特性是保护Web应用免受XSS攻击的重要防线。在大多数情况下,你应该依赖这一特性来确保你的HTML输出是安全的。