GoFrame 模板引擎對變量轉義輸出- XSS 漏洞

GoFrame 模板引擎對變量轉義輸出- XSS 漏洞

環境:html

  • gf v1.14.4
  • go 1.11

官網說明

默認狀況下,模板引擎對全部的變量輸出並無使用HTML轉碼處理,也就是說,若是開發者處理很差,可能會存在XSS漏洞。git

不用擔憂,GF框架固然已經充分考慮到這點,而且爲開發者提供了比較靈活的配置參數來控制是否默認轉義變量輸出的HTML內容。該特性能夠經過AutoEncode配置項,或者SetAutoEncode方法來開啓/關閉。github

須要注意的是,該特性並不會影響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. 執行輸出xss

    姓名: &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攻擊。(測試瀏覽器均處於默認設置狀況下。)

相關文章
相關標籤/搜索