From 539bcc65c6cbeb302d53e37bee4fefd5e03ac787 Mon Sep 17 00:00:00 2001 From: vCaesar Date: Sun, 18 Dec 2016 16:20:18 +0800 Subject: [PATCH] Add 0.9.1.md syntax highlighting --- zh/09.1.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/zh/09.1.md b/zh/09.1.md index baaed84f..cf09f470 100644 --- a/zh/09.1.md +++ b/zh/09.1.md @@ -49,9 +49,12 @@ CSRF的防御可以从服务端和客户端两方面着手,防御效果是从 接下来我就以Go语言来举例说明,如何限制对资源的访问方法: +```Go + mux.Get("/user/:uid", getuser) mux.Post("/user/:uid", modifyuser) +``` 这样处理后,因为我们限定了修改只能使用POST,当GET方式请求时就拒绝响应,所以上面图示中GET方式的CSRF攻击就可以防止了,但这样就能全部解决问题了吗?当然不是,因为POST也是可以模拟的。 因此我们需要实施第二步,在非GET方式的请求中增加随机数,这个大概有三种方式来进行: @@ -62,6 +65,8 @@ CSRF的防御可以从服务端和客户端两方面着手,防御效果是从 生成随机数token +```Go + h := md5.New() io.WriteString(h, strconv.FormatInt(crutime, 10)) io.WriteString(h, "ganraomaxxxxxxxxx") @@ -70,12 +75,17 @@ CSRF的防御可以从服务端和客户端两方面着手,防御效果是从 t, _ := template.ParseFiles("login.gtpl") t.Execute(w, token) +``` 输出token +```html +``` 验证token +```Go + r.ParseForm() token := r.Form.Get("token") if token != "" { @@ -83,7 +93,8 @@ CSRF的防御可以从服务端和客户端两方面着手,防御效果是从 } else { //不存在token报错 } - + +``` 这样基本就实现了安全的POST,但是也许你会说如果破解了token的算法呢,按照理论上是,但是实际上破解是基本不可能的,因为有人曾计算过,暴力破解该串大概需要2的11次方时间。 ## 总结