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