ASP.NET Cookie:不是問題的問題
ASP.NET Cookie:習以為常的會話狀態(tài)
我們對會話狀態(tài)這一概念是如此習以為常,以至于我們忘記了會話狀態(tài)是在 1997 年用 Active Server Pages (ASP) 引入的一個手段。會話狀態(tài)使開發(fā)人員能夠在用戶與應用程序交互這段時間內(nèi)持久保存有關(guān)該用戶的一塊信息。特定于用戶的信息通常會保留 20 分鐘長的時段,而每當用戶返回該站點時,該時段都將重新開始計時。
當用戶首次連接到站點時,將以內(nèi)存塊的形式創(chuàng)建一個全新的會話狀態(tài)以存放數(shù)據(jù),同時,還會創(chuàng)建一個 ID 以便將其與當前用戶唯一地聯(lián)系起來。當下一次發(fā)出請求時,該用戶將被要求提交該會話 ID,以便檢索并正確地還原會話狀態(tài)。會話 ID 是 ASP 和 ASP.NET 完全自主生成的字母數(shù)字字符串。用戶如何管理它并確保用每個后續(xù)請求來包裝它呢?
ASP.NET Cookie:由來和好處
HTTP 協(xié)議的性質(zhì)是無狀態(tài)的,并且沒有任何人試圖更改這一事實。差不多二十年以前,當 Netscape Corporation 開發(fā)它的第一個瀏覽器時,它“發(fā)明”了一種通過 HTTP 工作的持久性機制。它將其稱為 HTTP Cookie。有趣的是,計算機科學行話中的術(shù)語“Cookie”僅僅表示一塊由應用程序持有的不透明數(shù)據(jù),它會影響用戶但永遠不會由用戶直接管理。
因此,Cookie 存儲會話的 ID,而瀏覽器則在 Web 服務器和本地用戶的計算機之間來回移動它們的內(nèi)容。當啟用了 Cookie 的瀏覽器收到響應數(shù)據(jù)包時,它將尋找附加的 Cookie,并將它們的內(nèi)容存儲到本地 Windows 目錄中特定文件夾的某個文本文件中。Cookie 還包含有關(guān)該源站點的信息。接下來,當瀏覽器向該站點發(fā)送請求時,它會在 Cookie 文件夾中查找源自該域的 Cookie。如果找到,則該 Cookie 自動附加到傳出的數(shù)據(jù)包中。該 Cookie 將命中服務器應用程序,并在此被檢測、提取和處理。
最終,Cookie 使 Web 站點更加易于導航,因為它們在用戶體驗之上提供了必然跨越多個請求的連續(xù)性錯覺。
ASP.NET Cookie:危險的程序?
多年以來,Cookie 只被視為一種技術(shù)功能,并且在很大程度上被忽略了。幾年以前,針對 Web 安全的世界范圍的浪潮將人們的注意力集中于 Cookie 身上。Cookie 被斷定包含危險的程序,它們甚至能夠超出計算機的物理邊界來竊取有價值的信息。
不言而喻,Cookie 不是程序,因而無法自行收集任何信息 — 更不用說有關(guān)用戶的任何個人信息。更加清楚的是,Cookie 是 Web 站點可以放置在用戶的計算機中以便以后檢索和重用的一段文本。所存儲的信息是由無害的名稱-值對組成的。
要點在于,Cookie 不是標準 HTTP 規(guī)范的一部分,因此它們意味著瀏覽器和 Web 站點之間的一種協(xié)作。并非所有瀏覽器都支持 Cookie,而且更為重要的是,并非所有用戶都在他們自己的瀏覽器副本中啟用 Cookie 支持。
在歷史上,有一些 Web 站點功能是如此緊密地與 Cookie 相聯(lián)系,以至于很難區(qū)分究竟是哪個功能最先出現(xiàn)。一方面,用 Cookie 對會話狀態(tài)管理和用戶身份驗證進行編碼要容易得多。另一方面,如果您觀察一下站點與用于訪問頁的瀏覽器有關(guān)的統(tǒng)計信息,那么您可能會驚訝地發(fā)現(xiàn),相當一部分用戶在連接時禁用了 Cookie。這一點會對開發(fā)人員有所啟示。
總而言之,Cookie 本身并不是問題,但它們的使用無疑給予一些服務器代碼在客戶端計算機中存儲一段數(shù)據(jù)的能力。這預示著一些潛在的安全風險和一種不夠理想的總體狀況。(在某些情況以及某些國家/地區(qū)中,應用程序要求 Cookie 工作甚至是非法的。)
【編輯推薦】