GoFrame 模板引擎對變數轉義輸出- XSS 漏洞
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
漏洞。