環境:html
默認狀況下,模板引擎對全部的變量輸出並無使用HTML轉碼處理,也就是說,若是開發者處理很差,可能會存在XSS漏洞。git
不用擔憂,GF
框架固然已經充分考慮到這點,而且爲開發者提供了比較靈活的配置參數來控制是否默認轉義變量輸出的HTML
內容。該特性能夠經過AutoEncode
配置項,或者SetAutoEncode
方法來開啓/關閉。github
須要注意的是,該特性並不會影響
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) }
執行輸出xss
姓名: <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
漏洞。
上述XSS
漏洞《Go Web 編程》有說明火狐瀏覽器沒法防護此類型攻擊。
測試證實:
現有版本
Chrome
、Edge
,火狐瀏覽器都沒法防護此類型XSS
攻擊。(測試瀏覽器均處於默認設置狀況下。)