环境: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
攻击。(测试浏览器均处于默认设置状况下。)