Cookie簡介
Cookie分爲“Persistent”和“Non-Persistent”類型。 “Persistent”Cookie在瀏覽器關閉後,Cookie會保存在硬盤上;”Non-Persistent” Cookie只是存在內存中,當瀏覽器關閉時,Cookie消失。
瀏覽器通常都提供管理Cookie的功能。
Cookie內容
一條Cookie通常由多個“屬性=值”格式的元素組成。例如下面是用戶登錄Gmail時產生的一條Cookie
SetCookie: GV=; Domain=mail.google.com; Expires=Sun, 09Oct05 13:47:42 GMT; Path=/mail
如上例子,一條Cookie通常有5條參數:
l Cookie的名稱 (GV)
l Cookie的值 (空白)
l Cookie的有效期 (Sun, 09Oct05 13:47:42 GMT)
l Cookie有效的域名 (mail.google.com)
l Cookie有效的路徑 (/mail)
除了以上5個參數外,還有其他一些參數,例如爲了安全行,可以加上secure和HttpOnly。
Cookie的安全風險
下面列舉一些例子,說明了使用cookie可能帶來的安全隱患,以及消除這些隱患的方法。
1. 域名使用不當
從上面的Cookie例子中可以看到,每條Cookie有一個域名,限定Cookie生效的範圍。例如mail.google.com,這樣這條cookie只能在這個域名上生效,如果是google.com,就不能生效了,但是在子域名內,例如pop3.mail.google.com, 應該還是生效。但是如果有人把cookie域名寫成了.com或者.edu或者.net等,這樣這個cookie對大量的網域都有效。爲此有標準“RFC 2965”[描述http狀態管理的文檔]專門規定,默認下,對這樣只包含根域名的cookie一概禁止。
儘管如此,風險依然存在,例如一個網站www.abcfootball.com,登錄後cookie的域名應該是public.abcfootball.com,但是如果設置成了abcfootball.com,那麼意味着cookie對public.abcfootball.com,private.abcfootball.com,以及一切子域都有效,這樣這條cookie可能會讓用戶訪問到權限限定反問之外的資源。
避免的方法很簡單,就是把cookie的域名限定儘量設置準確,詳細。
2. 路徑使用不當
這個和“域名使用不當”類似,當cookie的限定訪問路徑設置過大時候,意味着cookie對所有子目錄都是有效的,會帶來非法訪問的可能。例如剛纔例子中路徑“/mail”設置成了根目錄“/”,用戶有可能用這條cookie訪問到除“/mail”之外的資源.
3. “Persistent” Cookie保存登錄信息
許多網站在登錄時使用類似於“記住登錄信息”的功能。這樣用戶登錄的信息【例如用戶名,密碼】會以“Persistent”Cookie的形式保存在硬盤上,例如登錄Gmail時候,保存的cookie可能是:
SetCookie: rememberme=true;Domain=.google.com;Path=/;Expires=Thu, 21Apr2016 12:03:07 GMT
這樣用戶在cookie過期之前再登錄google.com,網頁會直接進入gmail的inbox頁面. 這樣產生的巨大風險是,當其他用戶使用此機器時,一樣就自動進入你的郵箱了。
避免的方法是,當使用完郵箱後,應使用“登出”而不是直接關掉瀏覽器。開發者處理敏感信息登錄時,儘量採用Session機制,SessionID 默認使用“Non Persistent”Cookie保存,當“登出”或關閉瀏覽器時,就會自動從內存中消失。
4. “Persistent” Cookie保存敏感信息
和上面一樣,當用戶輸入敏感信息進行業務後,這些信息會保存在機器本地,例如網上購物,用戶的信用卡信息會保留在磁盤上。
避免這種風險的方法是,儘量少用公共機進行這樣業務;或者在業務完成後,使用瀏覽器的安全管理工具,刪除掉所有的Cookie。
5. 明文傳輸Cookie
Cookie經常用來存儲一些敏感信息,例如session id,如果明文在網上傳輸,傳輸過程中很可能被竊取。爲了保證cookie不被竊取,需要在cookie中加上“Secure”的屬性,這樣瀏覽器也能意識到這是敏感信息,會以不同的security level來對待;會提醒用戶,建議以SSL方式來連接,在cookie返回Server時,也以不同的安全級別來傳輸。
6. 緩存中的Cookie
現在緩存被大量應用,以提高網站訪問性能。如果包含個人敏感信息的Cookie被存儲在緩存上,很可能造成這些信息泄漏。
爲避免這種情況,在Response的Header中加上去除緩存的屬性:
Cachecontrol: nocache="setcookie"
或者
Cachecontrol: nocache="setcookie2"
一些私有頁面同樣也不應該被緩存,應該在Header中加上:
Cachecontrol: private
7. 跨域腳本攻擊(CSS: Cross Site Scripting Attack)
CSS是最普遍的網絡攻擊手段之一。通過一段惡意的腳本代碼,偷取用戶本地有效的Cookie,然後發送給惡意攻擊者,這些信息可能被非法應用。
網上防範的方法有很多,這裏介紹一種方式,給Cookie加上HttpOnly的屬性:
SetCookie: USER=123; expires=Wednesday, 20Apr06 23:12:40 GMT; HttpOnly
“HttpOnly”屬性能保證這條Cookie不能被腳本語言執行獲取到,而被髮送到第三方。這樣能保證這條Cookie的安全。