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