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

相关文章
相关标签/搜索