removed all the footers; formated all the files

This commit is contained in:
Oling Cat
2012-11-01 16:10:44 +08:00
parent 77b8677ae0
commit c059171e15
73 changed files with 4576 additions and 4782 deletions

57
9.1.md
View File

@@ -47,7 +47,7 @@ CSRF的防御可以从服务端和客户端两方面着手防御效果是从
mux.Get("/user/:uid", getuser)
mux.Post("/user/:uid", modifyuser)
这样处理后因为我们限定了修改只能使用POST当GET方式请求时就拒绝响应所以上面图示中GET方式的CSRF攻击就可以防止了但这样就能全部解决问题了吗当然不是因为POST也是可以模拟的。
因此我们需要实施第二步在非GET方式的请求中增加随机数这个大概有三种方式来进行
@@ -56,39 +56,36 @@ CSRF的防御可以从服务端和客户端两方面着手防御效果是从
- 每个请求使用验证码,这个方案是完美的,因为要多次输入验证码,所以用户友好性很差,所以不适合实际运用。
- 不同的表单包含一个不同的伪随机值我们在4.4小节介绍“如何防止表单多次递交”时介绍过此方案,复用相关代码,实现如下:
生成随机数token
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))
生成随机数token
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, token)
输出token
<input type="hidden" name="token" value="{{.}}">
验证token
h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))
r.ParseForm()
token := r.Form.Get("token")
if token != "" {
//验证token的合法性
} else {
//不存在token报错
}
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报错
}
这样基本就实现了安全的POST但是也许你会说如果破解了token的算法呢按照理论上是但是实际上破解是基本不可能的因为有人曾计算过暴力破解该串大概需要2的11次方时间。
## 总结
跨站请求伪造即CSRF是一种非常危险的Web安全威胁它被Web安全界称为“沉睡的巨人”其威胁程度由此“美誉”便可见一斑。本小节不仅对跨站请求伪造本身进行了简单介绍还详细说明造成这种漏洞的原因所在然后以此提了一些防范该攻击的建议希望对读者编写安全的Web应用能够有所启发。
## links
* [目录](<preface.md>)
* 上一节: [安全与加密](<9.md>)
* 下一节: [确保输入过滤](<9.2.md>)
## LastModified
* $Id$
## links
* [目录](<preface.md>)
* 上一节: [安全与加密](<9.md>)
* 下一节: [确保输入过滤](<9.2.md>)