• GoFrame 模板引擎对变量转义输出- XSS 漏洞


    GoFrame 模板引擎对变量转义输出- XSS 漏洞

    环境:

    • gf v1.14.4
    • go 1.11

    官网说明

    默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理不好,可能会存在XSS漏洞。

    不用担心,GF框架当然已经充分考虑到这点,并且为开发者提供了比较灵活的配置参数来控制是否默认转义变量输出的HTML内容。该特性可以通过AutoEncode配置项,或者SetAutoEncode方法来开启/关闭。

    需要注意的是,该特性并不会影响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. 执行输出

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

  • 相关阅读:
    java-transaction事件
    Cookie,Session基础知识
    JSP基础笔记
    PHP----学生管理系统
    C语言程序设计-----贪吃蛇
    2019年数维杯三场征战赛
    回忆2018年高教杯数学建模大赛
    iPad横屏模式研究
    IOS UIWebView截获html并修改便签内容,宽度自适应
    如何保持iOS上键盘出现时输入框不被覆盖
  • 原文地址:https://www.cnblogs.com/l1ng14/p/14071046.html
Copyright © 2020-2023  润新知