🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## CSRF的原理 一个典型的CSRF攻击有着如下的流程: * 受害者登录a.com,并保留了登录凭证(Cookie)。 * 攻击者引诱受害者访问了b.com。 * b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。 * a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。 * a.com以受害者的名义执行了act=xx。 * 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。 ## 如何预防CSRF 服务端的预防CSRF攻击的方式方法有多种,但思想上都是差不多的,主要从以下2个方面入手: 1. 正确使用GET,POST和Cookie; ``` mux.Get("/user/:uid", getuser) mux.Post("/user/:uid", modifyuser) ``` 2. 在非GET请求中增加伪随机数; 1. 生成随机数token ``` h := md5.New() io.WriteString(h, strconv.FormatInt(crutime, 10)) io.WriteString(h, "ganraomaxxxxxxxxx") token := fmt.Sprintf("%x", h.Sum(nil)) t, _ := template.ParseFiles("login.gtpl") t.Execute(w, token) ``` 输出token ``` <input type="hidden" name="token" value="{{.}}"> ``` 验证token ``` r.ParseForm() token := r.Form.Get("token") if token != "" { //验证token的合法性 } else { //不存在token报错 } ```