在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 6.4 預(yù)防session劫持
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫(kù)進(jìn)行ORM開(kāi)發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫(kù)
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語(yǔ)言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國(guó)際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫(kù)操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫(xiě)測(cè)試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測(cè)試
9.2 確保輸入過(guò)濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲(chǔ)
3.4 Go的http包詳解
8.2 WebSocket
10.3 國(guó)際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲(chǔ)密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲(chǔ)
2.4 struct類(lèi)型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語(yǔ)言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫(kù)
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問(wèn)數(shù)據(jù)庫(kù)
4 表單
3.5 小結(jié)
1.4 Go開(kāi)發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫(kù)
4.6 小結(jié)
8.4 RPC

6.4 預(yù)防session劫持

session劫持是一種廣泛存在的比較嚴(yán)重的安全威脅,在session技術(shù)中,客戶端和服務(wù)端通過(guò)session的標(biāo)識(shí)符來(lái)維護(hù)會(huì)話, 但這個(gè)標(biāo)識(shí)符很容易就能被嗅探到,從而被其他人利用.它是中間人攻擊的一種類(lèi)型。

本節(jié)將通過(guò)一個(gè)實(shí)例來(lái)演示會(huì)話劫持,希望通過(guò)這個(gè)實(shí)例,能讓讀者更好地理解session的本質(zhì)。

session劫持過(guò)程

我們寫(xiě)了如下的代碼來(lái)展示一個(gè)count計(jì)數(shù)器:

func count(w http.ResponseWriter, r *http.Request) {
    sess := globalSessions.SessionStart(w, r)
    ct := sess.Get("countnum")
    if ct == nil {
        sess.Set("countnum", 1)
    } else {
        sess.Set("countnum", (ct.(int) + 1))
    }
    t, _ := template.ParseFiles("count.gtpl")
    w.Header().Set("Content-Type", "text/html")
    t.Execute(w, sess.Get("countnum"))
}

count.gtpl的代碼如下所示:

Hi. Now count:{{.}}

然后我們?cè)跒g覽器里面刷新可以看到如下內(nèi)容:

http://wiki.jikexueyuan.com/project/go-web-programming/images/6.4.hijack.png?raw=true" alt="" />

圖6.4 瀏覽器端顯示count數(shù)

隨著刷新,數(shù)字將不斷增長(zhǎng),當(dāng)數(shù)字顯示為6的時(shí)候,打開(kāi)瀏覽器(以chrome為例)的cookie管理器,可以看到類(lèi)似如下的信息:

http://wiki.jikexueyuan.com/project/go-web-programming/images/6.4.cookie.png?raw=true" alt="" />

圖6.5 獲取瀏覽器端保存的cookie

下面這個(gè)步驟最為關(guān)鍵: 打開(kāi)另一個(gè)瀏覽器(這里我打開(kāi)了firefox瀏覽器),復(fù)制chrome地址欄里的地址到新打開(kāi)的瀏覽器的地址欄中。然后打開(kāi)firefox的cookie模擬插件,新建一個(gè)cookie,把按上圖中cookie內(nèi)容原樣在firefox中重建一份:

http://wiki.jikexueyuan.com/project/go-web-programming/images/6.4.setcookie.png?raw=true" alt="" />

圖6.6 模擬cookie

回車(chē)后,你將看到如下內(nèi)容:

http://wiki.jikexueyuan.com/project/go-web-programming/images/6.4.hijacksuccess.png?raw=true" alt="" />

圖6.7 劫持session成功

可以看到雖然換了瀏覽器,但是我們卻獲得了sessionID,然后模擬了cookie存儲(chǔ)的過(guò)程。這個(gè)例子是在同一臺(tái)計(jì)算機(jī)上做的,不過(guò)即使換用兩臺(tái)來(lái)做,其結(jié)果仍然一樣。此時(shí)如果交替點(diǎn)擊兩個(gè)瀏覽器里的鏈接你會(huì)發(fā)現(xiàn)它們其實(shí)操縱的是同一個(gè)計(jì)數(shù)器。不必驚訝,此處firefox盜用了chrome和goserver之間的維持會(huì)話的鑰匙,即gosessionid,這是一種類(lèi)型的“會(huì)話劫持”。在goserver看來(lái),它從http請(qǐng)求中得到了一個(gè)gosessionid,由于HTTP協(xié)議的無(wú)狀態(tài)性,它無(wú)法得知這個(gè)gosessionid是從chrome那里“劫持”來(lái)的,它依然會(huì)去查找對(duì)應(yīng)的session,并執(zhí)行相關(guān)計(jì)算。與此同時(shí) chrome也無(wú)法得知自己保持的會(huì)話已經(jīng)被“劫持”。

session劫持防范

cookieonly和token

通過(guò)上面session劫持的簡(jiǎn)單演示可以了解到session一旦被其他人劫持,就非常危險(xiǎn),劫持者可以假裝成被劫持者進(jìn)行很多非法操作。那么如何有效的防止session劫持呢?

其中一個(gè)解決方案就是sessionID的值只允許cookie設(shè)置,而不是通過(guò)URL重置方式設(shè)置,同時(shí)設(shè)置cookie的httponly為true,這個(gè)屬性是設(shè)置是否可通過(guò)客戶端腳本訪問(wèn)這個(gè)設(shè)置的cookie,第一這個(gè)可以防止這個(gè)cookie被XSS讀取從而引起session劫持,第二cookie設(shè)置不會(huì)像URL重置方式那么容易獲取sessionID。

第二步就是在每個(gè)請(qǐng)求里面加上token,實(shí)現(xiàn)類(lèi)似前面章節(jié)里面講的防止form重復(fù)遞交類(lèi)似的功能,我們?cè)诿總€(gè)請(qǐng)求里面加上一個(gè)隱藏的token,然后每次驗(yàn)證這個(gè)token,從而保證用戶的請(qǐng)求都是唯一性。

h := md5.New()
salt:="astaxie%^7&8888"
io.WriteString(h,salt+time.Now().String())
token:=fmt.Sprintf("%x",h.Sum(nil))
if r.Form["token"]!=token{
    //提示登錄
}
sess.Set("token",token)

間隔生成新的SID

還有一個(gè)解決方案就是,我們給session額外設(shè)置一個(gè)創(chuàng)建時(shí)間的值,一旦過(guò)了一定的時(shí)間,我們銷(xiāo)毀這個(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()) {
    globalSessions.SessionDestroy(w, r)
    sess = globalSessions.SessionStart(w, r)
}

session啟動(dòng)后,我們?cè)O(shè)置了一個(gè)值,用于記錄生成sessionID的時(shí)間。通過(guò)判斷每次請(qǐng)求是否過(guò)期(這里設(shè)置了60秒)定期生成新的ID,這樣使得攻擊者獲取有效sessionID的機(jī)會(huì)大大降低。

上面兩個(gè)手段的組合可以在實(shí)踐中消除session劫持的風(fēng)險(xiǎn),一方面, 由于sessionID頻繁改變,使攻擊者難有機(jī)會(huì)獲取有效的sessionID;另一方面,因?yàn)閟essionID只能在cookie中傳遞,然后設(shè)置了httponly,所以基于URL攻擊的可能性為零,同時(shí)被XSS獲取sessionID也不可能。最后,由于我們還設(shè)置了MaxAge=0,這樣就相當(dāng)于session cookie不會(huì)留在瀏覽器的歷史記錄里面。