go web 预防跨站脚本的实现方式


Posted in Golang onJune 11, 2021

一 点睛

现在的网站包含大量的动态内容以提高用户体验,比过去要复杂得多。所谓动态内容,就是根据用户环境和需要,Web 应用程序能够输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响。

攻击者通常会在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX 或 Flash 以欺骗用户。一旦得手,他们可以盗取用户帐户信息,修改用户设置,盗取或污染 cookie 和植入恶意广告等。

对 XSS 最佳的防护应该结合以下两种方式。

1 验证所有输入数据,有效检测攻击。

2 对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。

针对第2种方式,Go 是怎样预防的呢?Go 的 html/template 包中带有下面几个函数可以帮助转义。

func HTMLEscape(w io.Writer, b []byte) // 把 b 进行转义之后写到 w

func HTMLEscapeString(s string) string // 转义 s 之后返回结果字符串

func HTMLEscaper(args ...interface{}) string // 支持多个参数一起转义,返回结果字符串

二 先看一个转义的例子

 1 代码

package main
 
import (
   "fmt"
   "html/template"
   "log"
   "net/http"
)
 
// 登录逻辑
func login(w http.ResponseWriter, r *http.Request) {
   fmt.Println("method:", r.Method) // 获取请求的方法
   if r.Method == "GET" {
      t, _ := template.ParseFiles("src\\goweb\\demo3\\login.html") // 解析模板
      t.Execute(w, nil)                                            // 渲染模板,并发送给前端
   } else {
      // 请求的是登陆数据,那么执行登陆的逻辑判断
      // 解析表单
      r.ParseForm()
      fmt.Println("username:", r.Form["username"])
      fmt.Println("password:", r.Form["password"])
      template.HTMLEscape(w, []byte(r.Form.Get("username"))) //输出到客户端
   }
}
 
func main() {
   http.HandleFunc("/login", login)         // 设置访问的路由
   err := http.ListenAndServe(":9090", nil) // 设置监听的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 测试

如果在浏览器输入的 username 是 <script>alert()</script>,在浏览器上将看到下面内容。

go web 预防跨站脚本的实现方式

3 说明

Go 的 html/template 包默认帮忙过滤了 html 标签,将其进行了转义。

4 问题引出

如果要正常输出<script>alert()</script>,怎样处理呢?text/template 可以帮忙进行处理。

三 使用 text/template 进行处理

1 代码

package main
 
import (
   "log"
   "net/http"
   "text/template"
)
 
// 转义测试
func escape(w http.ResponseWriter, r *http.Request) {
   // 正常显示
   t, _ := template.New("foo").Parse(`{{define "T"}}Hello1, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", "<script>alert('you have been pwned')</script>")
}
 
func main() {
   http.HandleFunc("/escape", escape)       // 设置转义
   err := http.ListenAndServe(":9090", nil) // 设置监听的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 测试

go web 预防跨站脚本的实现方式

3 说明

当使用 text/template 这个包时,可以正常显示。

四 使用 html/template 进行处理

1 代码

package main
 
import (
   "html/template"
   "log"
   "net/http"
)
 
// 转义测试
func escape(w http.ResponseWriter, r *http.Request) {
   // 转义显示
   t, _ := template.New("foo").Parse(`{{define "T"}}Hello1, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", "<script>alert('you have been pwned')</script>")
    // 正常显示
   t, _ = template.New("foo").Parse(`{{define "T"}}Hello2, {{.}}!{{end}}`)
   t.ExecuteTemplate(w, "T", template.HTML("<script>alert('you have been pwned')</script>"))
}
 
func main() {
   http.HandleFunc("/escape", escape)       // 设置转义
   err := http.ListenAndServe(":9090", nil) // 设置监听的端口
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}

2 测试结果

go web 预防跨站脚本的实现方式

3 说明

当使用 html/template 这个包时,如果使用 template.HTML 函数,也可以正常显示,不使用 template.HTML 函数,转义显示。

以上就是go web 预防跨站脚本的详细内容,更多关于go web 预防跨站的资料请关注三水点靠木其它相关文章!

Golang 相关文章推荐
Go语言中break label与goto label的区别
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
go类型转换及与C的类型转换方式
May 05 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go Plugins插件的实现方式
Aug 07 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang生成Excel文档的方法步骤
Go timer如何调度
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 #Golang
Golang中异常处理机制详解
Go语言实现Snowflake雪花算法
Jun 08 #Golang
go语言中http超时引发的事故解决
Jun 02 #Golang
Golang二维数组的使用方式
May 28 #Golang
You might like
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python连接mongodb集群方法详解
2020/02/13 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
春风行动实施方案
2014/03/28 职场文书
教师节学生演讲稿
2014/09/03 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
2019年工作总结范文
2019/05/21 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书