ASP.NET中無(wú)Cookie會(huì)話的優(yōu)點(diǎn)與缺點(diǎn)
無(wú)Cookie會(huì)話的優(yōu)點(diǎn)
在 ASP.NET 中,會(huì)話管理和表單身份驗(yàn)證是唯一的兩個(gè)在后臺(tái)使用 Cookie 的系統(tǒng)功能。通過(guò)無(wú) Cookie 會(huì)話,您現(xiàn)在可以部署無(wú)論用戶的有關(guān) Cookie 的首選項(xiàng)如何都能正常工作的有狀態(tài)應(yīng)用程序。然而,就 ASP.NET 1.x 而言,仍然需要使用 Cookie 來(lái)實(shí)現(xiàn)表單身份驗(yàn)證。好消息是,在 ASP.NET 2.0 中,表單身份驗(yàn)證可以選擇以無(wú) Cookie 方式工作。
另一個(gè)經(jīng)常提出的反對(duì) Cookie 的理由是安全性。這是一個(gè)值得予以更多關(guān)注的要點(diǎn)。
Cookies 是無(wú)活動(dòng)能力的文本文件,因此,這些文件可能被攻擊者替換或損壞 — 只要他們獲得了對(duì)計(jì)算機(jī)的訪問(wèn)。真正的威脅并不在于 Cookie 可以在客戶端計(jì)算機(jī)上安裝什么,而是在于它們可以向目標(biāo)站點(diǎn)上載什么。Cookie 不是程序,并且永遠(yuǎn)不會(huì)像程序那樣運(yùn)行;然而,您計(jì)算機(jī)上安裝的其他軟件可以使用對(duì) Cookie 的瀏覽器內(nèi)置支持來(lái)遠(yuǎn)程從事破壞活動(dòng)。
此外,Cookie 要受到被盜竊的風(fēng)險(xiǎn)。一旦失竊,包含有價(jià)值的和私人的信息的 Cookie 就可能將其內(nèi)容泄露給惡意攻擊者,并且為其他類型的 Web 攻擊提供便利。總之,通過(guò)使用 Cookie,您將自己暴露在本可以消除的風(fēng)險(xiǎn)之中。這是真的嗎?
無(wú)Cookie會(huì)話的缺點(diǎn)
讓我們從另一個(gè)角度來(lái)考察安全性。您是否曾經(jīng)聽(tīng)說(shuō)過(guò)會(huì)話劫持?如果沒(méi)有,則請(qǐng)閱讀一下 TechNet Magazine 文章 Theft On The Web: Prevent Session Hijacking。簡(jiǎn)單說(shuō)來(lái),當(dāng)攻擊者獲得對(duì)特定用戶的會(huì)話狀態(tài)的訪問(wèn)時(shí),將發(fā)生會(huì)話劫持。其實(shí)質(zhì)是,攻擊者竊取有效的會(huì)話 ID,并且使用它侵入系統(tǒng)和窺探數(shù)據(jù)。獲取有效會(huì)話 ID 的一種常見(jiàn)方式是竊取有效的會(huì)話 Cookie。鑒于此,如果您認(rèn)為無(wú) Cookie 會(huì)話保護(hù)了您應(yīng)用程序的安全,那您就完全錯(cuò)了。實(shí)際上,對(duì)于無(wú) Cookie 會(huì)話,會(huì)話 ID 直接顯示在地址欄中!請(qǐng)嘗試下列操作:
連接到使用無(wú)Cookie會(huì)話的 Web 站點(diǎn)(例如,MapPoint)并獲得一個(gè)映射。此時(shí),該地址存儲(chǔ)在會(huì)話狀態(tài)中。
◆抓取 URL(直至頁(yè)名稱)。不要包括查詢字符串,但請(qǐng)確保該 URL 包括會(huì)話 ID。
◆將該 URL 保存到文件中,并將該文件復(fù)制/發(fā)送到另一臺(tái)計(jì)算機(jī)。
◆在第二臺(tái)計(jì)算機(jī)上打開(kāi)該文件,并將該 URL 粘貼到新瀏覽器實(shí)例中。
◆只要會(huì)話超時(shí)仍然有效,就會(huì)顯示同一個(gè)映射。
◆通過(guò)無(wú)Cookie會(huì)話,可以比以往任何時(shí)候都更加容易地竊取會(huì)話 ID。
從道德的觀點(diǎn)來(lái)看,竊取會(huì)話是應(yīng)該受到譴責(zé)的操作,我相信大家會(huì)一致認(rèn)同這一點(diǎn)。但它是否也是有害的?這取決于會(huì)話狀態(tài)中實(shí)際存儲(chǔ)的內(nèi)容。竊取會(huì)話 ID 本身并不會(huì)執(zhí)行超出代碼控制范圍的操作。但是,它可能向未經(jīng)授權(quán)的用戶泄露私有數(shù)據(jù),并且使一些壞家伙能夠執(zhí)行未經(jīng)授權(quán)的操作。有關(guān)如何在 ASP.NET 應(yīng)用程序中阻止會(huì)話劫持的提示,請(qǐng)閱讀 Wicked Code: Foiling Session Hijacking Attempts。(而且,它并不依賴于無(wú) Cookie 會(huì)話!)
使用無(wú)Cookie會(huì)話還會(huì)引起與鏈接有關(guān)的問(wèn)題。例如,您不能在 ASP.NET 頁(yè)中具有絕對(duì)的、完全限定的鏈接。如果您這樣做,那么源自該超鏈接的每個(gè)請(qǐng)求都將被視為新會(huì)話的一部分。無(wú) Cookie 會(huì)話要求您總是使用相對(duì) URL,就像在 ASP.NET 回發(fā)中一樣。僅當(dāng)您可以將會(huì)話 ID 嵌入到 URL 中時(shí),您才可以使用完全限定的 URL。但是,既然會(huì)話 ID 是在運(yùn)行時(shí)生成的,那么您如何才能做到這一點(diǎn)呢?
下面的代碼中斷了該會(huì)話:
- < a runat="server" href="/test/page.aspx">Click< /a>
要使用絕對(duì) URL,可以借助于一個(gè)小技巧,即,使用 HttpResponse 類上的 ApplyAppPathModifier 方法:
- < a runat="server" href=< % =Response.ApplyAppPathModifier("/test/page.aspx")%> >Click< /a>
ApplyAppPathModifier 方法采用一個(gè)表示 URL 的字符串作為參數(shù),并且返回一個(gè)嵌入了會(huì)話信息的絕對(duì) URL。例如,當(dāng)您需要從 HTTP 頁(yè)重定向到 HTTPS 頁(yè)時(shí),該技巧尤其有用。最后,請(qǐng)?zhí)貏e注意,每當(dāng)您在同一個(gè)瀏覽器內(nèi)部鍵入指向某個(gè)站點(diǎn)的路徑時(shí),您都將丟失無(wú) Cookie 會(huì)話的狀態(tài)。還要請(qǐng)您注意的是,對(duì)于移動(dòng)應(yīng)用程序,如果設(shè)備無(wú)法處理專門格式化的 URL,則無(wú) Cookie 會(huì)話可能會(huì)出現(xiàn)問(wèn)題。
【編輯推薦】