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语言map与string的相互转换的实现
Apr 07 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
golang json数组拼接的实例
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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函数代码
2010/04/22 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
vue弹出框组件封装实例代码
2019/10/31 Javascript
js实现点击生成随机div
2020/01/16 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
python 实现敏感词过滤的方法
2019/01/21 Python
python中while和for的区别总结
2019/06/28 Python
python判断自身是否正在运行的方法
2019/08/08 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
直接有效的自我评价
2014/01/11 职场文书
护士辞职信模板
2014/01/20 职场文书
阿德的梦教学反思
2014/02/06 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
学校门卫岗位职责
2014/03/16 职场文书
校庆筹备方案
2014/03/30 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
店铺转让协议书
2015/01/29 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android
德生BCL3000抢先使用感受和评价
2022/04/07 无线电