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 相关文章推荐
golang import自定义包方式
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 实现时间戳和时间的转化
May 07 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang定时器
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang入门之计时器
May 04 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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来处理多个提交任务
2008/05/08 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php中使用sftp教程
2015/03/30 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
javascript测试题练习代码
2012/10/10 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python实现kmp算法的实例代码
2019/04/03 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
python对XML文件的操作实现代码
2020/03/27 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
物理教师自荐信范文
2013/12/28 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
工人先进事迹材料
2014/12/26 职场文书
学校就业保障协议书
2019/06/24 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server