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漏洞。