GoFrame 模板引擎对变量转义输出- XSS 漏洞
环境:
- gf v1.14.4
- go 1.11
官网说明
默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理不好,可能会存在XSS漏洞。
不用担心,
GF
框架当然已经充分考虑到这点,并且为开发者提供了比较灵活的配置参数来控制是否默认转义变量输出的
HTML
内容。该特性可以通过
AutoEncode
配置项,或者
SetAutoEncode
方法来开启/关闭。
需要注意的是,该特性并不会影响
include
模板内置函数。
使用示例:
-
配置文件
[viewer]delimiters = [\"${\", \"}\"]autoencode = true
-
示例代码
package mainimport (\"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 jsg.View().SetAutoEncode(true)}
访问处理方法下的路径:
即可成功输出
html
内容,但是此时会存在
XSS
漏洞。
上述
XSS
漏洞《Go Web 编程》有说明火狐浏览器无法防御此类型攻击。
测试证明:
现有版本
Chrome
、
Edge
,火狐浏览器都无法防御此类型
XSS
攻击。(测试浏览器均处于默认设置情况下。)