GoFrame 模板引擎对变量转义输出- XSS 漏洞
环境:
- gf v1.14.4
- go 1.11
官网说明
默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理不好,可能会存在XSS漏洞。
不用担心,GF
框架当然已经充分考虑到这点,并且为开发者提供了比较灵活的配置参数来控制是否默认转义变量输出的HTML
内容。该特性可以通过AutoEncode
配置项,或者SetAutoEncode
方法来开启/关闭。
需要注意的是,该特性并不会影响
include
模板内置函数。
使用示例:
-
配置文件
[viewer] delimiters = ["${", "}"] autoencode = true
-
示例代码
package main import ( "fmt" "github.com/gogf/gf/frame/g" ) func main() { result, _ := g.View().ParseContent("姓名: ${.name}", g.Map{ "name": "<script>alert('john');</script>", }) fmt.Println(result) }
-
执行输出
姓名: <script>alert('john');</script>
那么如果需要进行不转义输出html
内容,除了上面得到的不受影响情况(使用include
模板内置函数)外,还有吗?
其实还有一个Go
原生提供的template.HTML()
方法:
func GetSummary(r *ghttp.Request) {
//测试 gf 模板 动作符号已修改为: ${}
err := r.Response.WriteTpl("readArticle.html", g.Map{
//开启 autoencode = true 配置之后会安全编码,转义所有 html js
"testText": template.HTML("<h1>编码h1?</h1>"),
})
注意此时配置文件已经开启转义输出html
内容:
[viewer]
autoencode = true
或者可以通过方法开启:
func main() {
g.Server().Run()
//开启 autoencode 配置之后会安全编码,转义所有 html js
g.View().SetAutoEncode(true)
}
访问处理方法下的路径:
即可成功输出html
内容,但是此时会存在XSS
漏洞。
上述XSS
漏洞《Go Web 编程》有说明火狐浏览器无法防御此类型攻击。
测试证明:
现有版本
Chrome
、Edge
,火狐浏览器都无法防御此类型XSS
攻击。(测试浏览器均处于默认设置情况下。)