cookieonly
設(shè)置SessionID的值只允許cookie設(shè)置肾胯,而不是通過(guò)URL重置方法設(shè)置,同時(shí)設(shè)置cookie的httponly為true。
屬性httponly是設(shè)置是否可通過(guò)客戶端腳本訪問(wèn)這個(gè)設(shè)置的cookie,可以防止這個(gè)cookie被XSS讀取從而引起session劫持,cookie設(shè)置不會(huì)像URL重置方式那么容易獲取SessionID抱究。
token
在每個(gè)請(qǐng)求加上一個(gè)隱藏的token,然后每次驗(yàn)證這個(gè)token带斑,從而保證用戶的請(qǐng)求都是唯一的鼓寺。
間隔生產(chǎn)新的SID
給session額外設(shè)置一個(gè)創(chuàng)建時(shí)間的值勋拟,一旦過(guò)了一定的時(shí)間,我們銷毀這個(gè)sessionID妈候,重新生成新的session敢靡,這樣可以一定程度上防止session劫持的問(wèn)題。
createtime := sess.Get("createtime")
if createtime == nil {
? ? sess.Set("createtime", time.Now().Unix())
} else if (createtime.(int64) + 60) < (time.Now().Unix()) { ? ?// 設(shè)置60s過(guò)期
? ? globalSessions.SessionDestroy(w, r)
? ? sess = globalSessions.SessionStart(w, r)
}
1)session啟動(dòng)后苦银,設(shè)置一個(gè)值記錄生成sessionID的時(shí)間啸胧;
2)通過(guò)判斷每次請(qǐng)求是否過(guò)期(60s)定期生成新的sessionID,這樣使得獲取有效sessionID的幾率大大降低幔虏;
總結(jié)
上面的幾種方式纺念,可以在實(shí)踐中消除session劫持的風(fēng)險(xiǎn):
1) 由于sessionID頻繁改變,使攻擊者難有機(jī)會(huì)獲取有效的sessionID想括;
2)因?yàn)閟essionID只能在cookie中傳遞陷谱,然后設(shè)置了httponly,所以基于URL攻擊的可能性為零主胧,同時(shí)被XSS獲取sessionID也不可能叭首。
3)由于我們還設(shè)置了MaxAge=0习勤,這樣就相當(dāng)于session cookie不會(huì)留在瀏覽器的歷史記錄里面踪栋。