cookie

儲存在用戶本地終端上的數據

Cookie,有時也用其複數形式Cookies。類型為“小型文本文件徠”,是某些網站為了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數據(通常經過加密),由用戶客戶端計算機暫時或永久保存的信息。

簡介


Cookie 並不是它的原意“甜餅”的意思, 而是一個保存在客戶機中的簡單的文本文件, 這個文件與特定的 Web 文檔關聯在一起, 保存了該客戶機訪問這個Web 文檔時的信息, 當客戶機再次訪問這個 Web 文檔時這些信息可供該文檔使用。由於“Cookie”具有可以保存在客戶機上的神奇特性, 因此它可以幫助我們實現記錄用戶個人信息的功能, 而這一切都不必使用複雜的CGI等程序。
舉例來說, 一個 Web 站點可能會為每一個訪問者產生一個唯一的ID, 然後以 Cookie 文件的形式保存在每個用戶的機器上。如果使用瀏覽器訪問 Web, 會看到所有保存在硬碟上的 Cookie。在這個文件夾里每一個文件都是一個由“名/值”對組成的文本文件,另外還有一個文件保存有所有對應的 Web 站點的信息。在這裡的每個 Cookie 文件都是一個簡單而又普通的文本文件。透過文件名, 就可以看到是哪個 Web 站點在機器上放置了Cookie(當然站點信息在文件里也有保存) 。

組成


Cookie是一段不超過4KB的小型文本數據,由一個名稱(Name)、一個值(Value)和其它幾個用於控制Cookie有效期、安全性、使用範圍的可選屬性組成。其中:
(1)Name/Value:設置Cookie的名稱及相對應的值,對於認證Cookie,Value值包括Web伺服器所提供的訪問令牌。
(2)Expires屬性:設置Cookie的生存期。有兩種存儲類型的Cookie:會話性與持久性。Expires屬性預設時,為會話性Cookie,僅保存在客戶端內存中,並在用戶關閉瀏覽器時失效;持久性Cookie會保存在用戶的硬碟中,直至生存期到或用戶直接在網頁中單擊“註銷”等按鈕結束會話時才會失效。
(3)Path屬性:定義了Web站點上可以訪問該Cookie的目錄。
(4)Domain屬性:指定了可以訪問該 Cookie 的 Web 站點或域。Cookie 機制並未遵循嚴格的同源策略,允許一個子域可以設置或獲取其父域的 Cookie。當需要實現單點登錄方案時,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻擊的危險,比如攻擊者可以藉此發動會話定置攻擊。因而,瀏覽器禁止在 Domain 屬性中設置.org、.com 等通用頂級域名、以及在國家及地區頂級域下註冊的二級域名,以減小攻擊發生的範圍。
(5)Secure屬性:指定是否使用HTTPS安全協議發送Cookie。使用HTTPS安全協議,可以保護Cookie在瀏覽器和Web伺服器間的傳輸過程中不被竊取和篡改。該方法也可用於Web站點的身份鑒別,即在HTTPS的連接建立階段,瀏覽器會檢查Web網站的SSL證書的有效性。但是基於兼容性的原因(比如有些網站使用自簽署的證書)在檢測到SSL證書無效時,瀏覽器並不會立即終止用戶的連接請求,而是顯示安全風險信息,用戶仍可以選擇繼續訪問該站點。由於許多用戶缺乏安全意識,因而仍可能連接到Pharming攻擊所偽造的網站。
(6)HTTPOnly 屬性:用於防止客戶端腳本通過document.cookie屬性訪問Cookie,有助於保護Cookie不被跨站腳本攻擊竊取或篡改。但是,HTTPOnly的應用仍存在局限性,一些瀏覽器可以阻止客戶端腳本對Cookie的讀操作,但允許寫操作;此外大多數瀏覽器仍允許通過XMLHTTP對象讀取HTTP響應中的Set-Cookie頭。

安全威脅


Cookie捕獲重放

攻擊者可以通過木馬等惡意程序,或使用跨站腳本攻擊等手段偷竊存放在用戶硬碟或內存中的Cookie。藉助網路攻擊手段,包括在不安全的區域網中被動地監聽網路通信;通過攻擊網路用戶的路由器,或通過搭建惡意的無線路由器等手法,控制路由基礎設施,將網路流量重定向到攻擊者控制的主機;發動DNSPharming(域欺騙)攻擊,通過DNS緩存中毒、DNS應答欺騙、或修改用戶端的本地域名解析文件等方法攻擊DNS系統,導致用戶對合法網站的訪問請求被重定向到惡意網站等等,同樣可能竊取Cookie。對於捕獲到的認證Cookie,攻擊者往往會猜測其中的訪問令牌,試圖獲取會話ID、用戶名與口令、用戶角色、時間戳等敏感信息;或者直接重放該Cookie,假冒受害者的身份發動攻擊。

惡意 Cookies

Cookies 是文本文件,一般情況下認為它不會造成安全威脅。但是,如果在 Cookies 中通過特殊標記語言,引入可執行代碼,就很可能給用戶造成嚴重的安全隱患。HTML 為區別普通文本和標記語言,用符號“<>”來指示HTML 代碼。這些 HTML 代碼或者定義 Web 網頁格式,或者引入 Web 瀏覽器可執行代碼段。 Web 服務 器可以使用Cookies 信息創建動態網頁。假使 Cookies 包含可執行惡意代碼段,那麼在顯示合成有該 Cookies 的網頁時,就會自動執行這段惡意代碼。當然,惡意代碼能否真正造成危害,還取決於Web 站點的安全配置策略。

會話定置

會話定置(Session Fixation)攻擊是指,攻擊者向受害者主機注入自己控制的認證Cookie等信息,使得受害者以攻擊者的身份登錄網站,從而竊取受害者的會話信息。注入Cookie的方法包括:使用跨站腳本或木馬等惡意程序;或偽造與合法網站同域的站點,並利用各種方法欺騙用戶訪問該仿冒網站,從而通過HTTP響應中的Set-Cookie頭將攻擊者擁有的該域Cookie發送給用戶等。

CSRF攻擊

跨站請求偽造(Cross-Site Request Forgery,簡稱CSRF)是指,攻擊者可能利用網頁中的惡意代碼強迫受害者瀏覽器向被攻擊的Web站點發送偽造的請求,篡奪受害者的認證Cookie等身份信息,從而假冒受害者對目標站點執行指定的操作。Firefox、Opera等瀏覽器使用單進程機制,多個窗口或標籤使用同一個進程,共享Cookie等會話數據。IE則混合使用單進程與多進程模式,一個窗口中的多個標籤,以及使用“CTRL+N”或單擊網頁中的鏈接打開的新窗口使用同一進程,共享會話數據;只有直接運行IE可執行程序打開窗口時,才會創建新的進程。Chrome雖然使用多進程機制,然而經測試發現,其不同的窗口或標籤之間仍會共享會話數據,除非使用隱身訪問方式。因而,用戶同時打開多個瀏覽器窗口或標籤訪問網際網路資源時,就為CSRF攻擊篡奪用戶的會話Cookie創造了條件。另外,如果一個Web站點提供持久化Cookie,則CSRF攻擊將更直接、更容易。

安全防護


Web伺服器端防護

通過Cookie在客戶端與伺服器端進行交互,最終實現對用戶身份的認證,Cookie成了用戶整個身份的代替,其安全性決定了整個系統的安全性,Cookie的安全性問題主要有以下幾方面:(1)Cookie被用戶非法篡改,如篡改其中的expire項,可將Cookie的有效期延長;篡改path項可使用戶能夠訪問伺服器上不被授權的內容;或修改domain項,使用戶能夠訪問不被授權的伺服器從而獲得合法用戶的信息等;(2)被非法用戶非法截獲,然後在有限期內重放,則非法用戶將享有合法用戶的合法權益,可能會損害網站方的利益;(3)若Cookie被伺服器加密,而非法用戶通過強力攻擊或其他手段獲得了相應的加密密鑰,則非法用戶可以偽造任何合法Cookie,從而可以訪問合法用戶的所有個性化信息,甚至是賬戶信息等。
面對諸如此類的攻擊手段,有必要從伺服器端對Cookie進行安全設計,保護措施主要有:(1 )加入MAC以進行完整性校驗;(2)防止非法用戶非法截獲后的重放,可以讓用戶對相關信息進行數字簽名,加強有效性驗證;(3)對Cookie本身進行隨機密鑰加密,保證Cookie本身的信息安全。

客戶端瀏覽器防護

客戶端瀏覽器為了保證本地的Cookie安全,採取了對不同訪問網站的統一Cookie加密,在相應的系統目錄下,只可看見一個與Cookie相關的加密文件,而且其中的Cookie文件,已被瀏覽器加密,用戶不可見,在用戶訪問特定站點的時候,可由瀏覽器對cookies文件進行調用並進行解密,將特定站點的Cookie發送到指定的站點伺服器中,實現對用戶的Cookie的認證。

主機的安全防護

在原有的伺服器端以及客戶端對Cookie的安全性控制下,鑒於不同的客戶端瀏覽器對站點的Cookie控制相互獨立,可以採取在客戶端瀏覽器對產生的Cookie文件進行基於主機特徵的安全性認證,即在瀏覽器產生Cookie加密文件時,在Cookie文件中加入一段主機的特徵,生成一個雙層加密的新的Cookie文件;在調用Cookie的時候,通過對Cookie文件進行主機特徵的匹配,選擇對內層的文件進行解密調用。
然後,對嵌套了主機序列號的內層密文進行二次加密;內層加密保證對源Cookie內容的加密,保證Cookie信息的不可見,外層加密保證對主機特徵的保護,以避免對主機特徵的替換,通過對Cookie加入主機特徵,以及兩次對Cookie加密,可以在原有的防護機制下,為Cookie提供更加安全的保護。

認證機制


在 Web認證中 ,因為HTTP協議本身的局限,必須採用其他技術將相關認證標記以某種方式持續傳送,以免客戶從一個頁面跳轉至另一個頁面時重新輸入認證信息。基於Cookie的認證過程,主要由以下三個階段組成:
(1)發布Cookie。當用戶試圖訪問某Web站點中需要認證的資源時,Web伺服器會檢查用戶是否提供了認證Cookie,如果沒有,則將用戶重定向到登錄頁面。在用戶成功登錄后,Web伺服器會產生認證Cookie,並通過HTTP響應中的Set-Cookie頭髮送給客戶端,用於對用戶隨後的請求進行檢查和驗證,接著將用戶重定向到初始請求的資源。
徠(2)檢索Cookie。在用戶隨後的訪問請求中,客戶端瀏覽器檢索Path和Domain等屬性與用戶請求資源相匹配的Cookie,並將找到的Cookie通過HTTP請求中的Cookie頭提交給Web伺服器。
(3)驗證CookieWeb伺服器提取客戶端瀏覽器遞交的Cookie,驗證其中的訪問令牌。若合法,則將訪問請求的資源發送給客戶端瀏覽器;反之則拒絕用戶的訪問請求。Cookie 認證技術簡化了用戶訪問 Web 網站資源的過程,即用戶只需在初次登錄網站時輸入身份信息進行認證,隨後便可以訪問被授權的所有站點資源,不再需要重複手工提交身份信息。

實例


由於Cookies是我們瀏覽的網站傳輸到用戶計算機硬碟中的文本文件或內存中的數據,因此它在硬碟中存放的位置與使用的操作系統和瀏覽器密切相關。在Windows 9X系統計算機中,Cookies文件的存放位置為C:\Windows\Cookies,在Windows NT/2000/XP的計算機中,Cookies文件的存放位置為C:\Documentsand Settings\用戶名\Cookies。硬碟中的Cookies文件可以被Web瀏覽器讀取,它的命令格式為:用戶名@網站地址[數字].txt。要注意的是:硬碟中的Cookies屬於文本文件,不是程序。

設置

可以在IE的“工具/Internet選項”的“常規”選項卡中,選擇“設置/ 查看文件”,查看所有保存到電腦里Cookies。這些文件通常是以user@domain格式命名的,user是本地用戶名,domain是所訪問的網站的域名。如果使用NetsCape瀏覽器,則存放在“C:\PROGRAMFILES\NETSCAPE\USERS\”裡面,與IE不同的是,NETSCAPE是使用一個Cookie文件記錄所有網站的Cookies。可對Cookie進行適當設置:打開“工具/Internet選項”中的“隱私”選項卡(注意該設置只在IE6.0中存在,其他版本IE可以單擊“工具/Internet選項”|“安全”標籤中的“自定義級別”按鈕,進行簡單調整),調整Cookie的安全級別。通常情況,可以調整到“中高”或者“高”的位置。多數的論壇站點需要使用Cookie信息,如果從來不去這些地方,可以將安全級調到“阻止所有Cookies”;如果只是為了禁止個別網站的Cookie,可以單擊“編輯”按鈕,將要屏蔽的網站添加到列表中。在“高級”按鈕選項中,可以對第一方Cookie和第三方的Cookie進行設置,第一方Cookie是正在瀏覽的網站的Cookie,第三方Cookie是非正在瀏覽的網站發送的Cookie ,通常要對第三方Cookie選擇“拒絕”。如果需要保存Cookie,可以使用IE的“導入導出”功能,打開“文件/導入導出”,按提示操作即可。

寫入與讀取

Cookies集合是附屬於Response對象及Request對象的數據集合,使用時需要在前面加上Response或Request。用於給客戶機發送Cookies的語法通常為:
< %Response.cookies(“Cookies名稱”)=數據% >
當給不存在的Cookies集合設置時,就會在客戶機創建,如果該Cookies己存在,則會被代替。由於Cookies 是作為HTTP傳輸的頭信息的一部分發給客戶機的,所以向客戶機發送Cookies的代碼一般放在發送給瀏覽器的HTML 文件的標記之前。如果用戶要讀取Cookies,則必須使用Request對象的Cookies集合,其使用方法是:
< %efg=request.cookies(“abc”) (將cookies對象abc的值賦給efg)% >
需要注意的是,只有在伺服器未被下載任何數據給瀏覽器前,瀏覽器才能與Server進行Cookies集合的數據交換,一旦瀏覽器開始接收Server所下載的數據,Cookies的數據交換則停止,為了避免錯誤,要在程序和前面加上response.Buffer=True。