@@ -6,24 +6,24 @@ session劫持是一种广泛存在的比较严重的安全威胁,在session技
6
6
我们写了如下的代码来展示一个count计数器:
7
7
``` Go
8
8
9
- func count (w http .ResponseWriter , r *http .Request ) {
10
- sess := globalSessions.SessionStart (w, r)
11
- ct := sess.Get (" countnum" )
12
- if ct == nil {
13
- sess.Set (" countnum" , 1 )
14
- } else {
15
- sess.Set (" countnum" , (ct.(int ) + 1 ))
16
- }
17
- t , _ := template.ParseFiles (" count.gtpl" )
18
- w.Header ().Set (" Content-Type" , " text/html" )
19
- t.Execute (w, sess.Get (" countnum" ))
9
+ func count (w http .ResponseWriter , r *http .Request ) {
10
+ sess := globalSessions.SessionStart (w, r)
11
+ ct := sess.Get (" countnum" )
12
+ if ct == nil {
13
+ sess.Set (" countnum" , 1 )
14
+ } else {
15
+ sess.Set (" countnum" , (ct.(int ) + 1 ))
20
16
}
17
+ t , _ := template.ParseFiles (" count.gtpl" )
18
+ w.Header ().Set (" Content-Type" , " text/html" )
19
+ t.Execute (w, sess.Get (" countnum" ))
20
+ }
21
21
22
22
```
23
23
count.gtpl的代码如下所示:
24
24
``` Go
25
25
26
- Hi . Now count:{{.}}
26
+ Hi. Now count:{{.}}
27
27
```
28
28
然后我们在浏览器里面刷新可以看到如下内容:
29
29
@@ -60,27 +60,27 @@ count.gtpl的代码如下所示:
60
60
第二步就是在每个请求里面加上token,实现类似前面章节里面讲的防止form重复递交类似的功能,我们在每个请求里面加上一个隐藏的token,然后每次验证这个token,从而保证用户的请求都是唯一性。
61
61
``` Go
62
62
63
- h := md5.New ()
64
- salt := " astaxie% ^7&8888"
65
- io.WriteString (h,salt+time.Now ().String ())
66
- token := fmt.Sprintf (" %x " ,h.Sum (nil ))
67
- if r.Form [" token" ]!=token{
68
- // 提示登录
69
- }
70
- sess.Set (" token" ,token)
63
+ h := md5.New ()
64
+ salt := " astaxie% ^7&8888"
65
+ io.WriteString (h,salt+time.Now ().String ())
66
+ token := fmt.Sprintf (" %x " ,h.Sum (nil ))
67
+ if r.Form [" token" ]!=token{
68
+ // 提示登录
69
+ }
70
+ sess.Set (" token" ,token)
71
71
72
72
```
73
73
### 间隔生成新的SID
74
74
还有一个解决方案就是,我们给session额外设置一个创建时间的值,一旦过了一定的时间,我们销毁这个sessionID,重新生成新的session,这样可以一定程度上防止session劫持的问题。
75
75
``` Go
76
76
77
- createtime := sess.Get (" createtime" )
78
- if createtime == nil {
79
- sess.Set (" createtime" , time.Now ().Unix ())
80
- } else if (createtime.(int64 ) + 60 ) < (time.Now ().Unix ()) {
81
- globalSessions.SessionDestroy (w, r)
82
- sess = globalSessions.SessionStart (w, r)
83
- }
77
+ createtime := sess.Get (" createtime" )
78
+ if createtime == nil {
79
+ sess.Set (" createtime" , time.Now ().Unix ())
80
+ } else if (createtime.(int64 ) + 60 ) < (time.Now ().Unix ()) {
81
+ globalSessions.SessionDestroy (w, r)
82
+ sess = globalSessions.SessionStart (w, r)
83
+ }
84
84
```
85
85
session启动后,我们设置了一个值,用于记录生成sessionID的时间。通过判断每次请求是否过期(这里设置了60秒)定期生成新的ID,这样使得攻击者获取有效sessionID的机会大大降低。
86
86
0 commit comments