GoFrame 模板引擎对变量转义输出- XSS 漏洞

GoFrame 模板引擎对变量转义输出- XSS 漏洞

环境:

  • gf v1.14.4
  • go 1.11

官网说明

默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理不好,可能会存在XSS漏洞。

不用担心,GF框架当然已经充分考虑到这点,并且为开发者提供了比较灵活的配置参数来控制是否默认转义变量输出的HTML内容。该特性可以通过AutoEncode配置项,或者SetAutoEncode方法来开启/关闭。

需要注意的是,该特性并不会影响include模板内置函数。

使用示例:

  1. 配置文件

     [viewer]
         delimiters  =  ["${", "}"]
         autoencode  =  true
    
  2. 示例代码

     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)
     }
    
  3. 执行输出

     姓名: &lt;script&gt;alert(&#39;john&#39;);&lt;/script&gt;
    

那么如果需要进行不转义输出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 编程》有说明火狐浏览器无法防御此类型攻击。

测试证明:

现有版本ChromeEdge,火狐浏览器都无法防御此类型XSS攻击。(测试浏览器均处于默认设置情况下。)

原文地址:https://www.cnblogs.com/l1ng14/p/14071046.html