呂俊宏,周江峰
(河北省財政廳,石家莊 050051)
深入解析Cookie技術
呂俊宏,周江峰
(河北省財政廳,石家莊 050051)
在Web技術的發展史上,Cookie技術的出現是一次重大的變革。但是,Cookie技術又是一項非常有爭議的技術,從它誕生之日起就成為廣大網絡用戶和Web開發人員的一個爭論焦點,原因不是Cookie的功能太弱,而是認為Cookie的使用會對網絡用戶的隱私信息構成危害。
網絡安全;Cookie;隱私;大數據;廣告騷擾
Cook ie技術最先被Netscape公司引入到Navigator瀏覽器中。之后,World Wide Web協會支持并采納了Cookie標準,微軟也在Internet Explorer瀏覽器中使用了Cookie。現在,絕大多數瀏覽器都支持Cookie,或者至少兼容Cookie技術的使用。目前,幾乎所有的網站設計者都使用了Cookie技術。Cookie的廣泛使用導致了人們對個人信息安全的擔憂。有的網站和機構濫用Cookie,未經訪問者的許可就搜集他人的個人資料,達到構建用戶數據庫、發送廣告等營利目的,造成用戶隱私信息的泄露。
因此,系統研究Cookie的技術特性及其存在的安全問題,研究防范Cookie泄露用戶隱私信息的措施,不僅能使個人信息的安全得到保障,而且能更安全地利用Cookie技術服務于互聯網應用。
2.1 Cookie定義及其功能
Cookie是一小段文本信息,伴隨著用戶請求和頁面在Web服務器和瀏覽器之間傳遞。Cookie包含每次用戶訪問站點時Web應用程序都可以讀取的信息。
因為HTTP協議是無狀態的,對于一個瀏覽器發出的多次請求,Web服務器無法區分是不是來源于同一個瀏覽器。所以,需要額外的數據用于維護會話,Cookie正是這樣的一段隨HTTP請求一起被傳遞的額外數據。
Cookie只是一段文本,所以它只能保存字符串。而且瀏覽器對它有大小限制,它會隨著每次請求被發送到服務器,所以應該保證它不要太大。Cookie的內容也是明文保存的,有些瀏覽器提供界面修改,所以不適合保存重要的或者涉及隱私的內容。
大多數瀏覽器支持最大為4096字節的Cookie,最好用Cookie來存儲少量數據或者存儲用戶ID之類的標識符。用戶ID隨后便可用于標識用戶,以及從數據庫或其他數據源中讀取用戶信息。瀏覽器還限制站點可以在用戶計算機上存儲的Cookie的數量,大多數瀏覽器只允許每個站點存儲20個Cookie,如果試圖存儲更多Cookie,則最舊的Cookie便會被丟棄。有些瀏覽器還會對它們將接受的來自所有站點的Cookie總數作出絕對限制,通常為300個。
2.2 Cookie的技術實現
2.2.1 網站如何設置Cookie(寫操作)
(1)當你在瀏覽器中點某個書簽或者在瀏覽器地址欄輸入某個網址,瀏覽器會向對應的網站發起一個HTTP請求(術語是HTTP Request)。
(2)然后,網站的服務器收到這個HTTP請求之后,會把相應的內容(比如網頁、圖片等)發回給瀏覽器(這稱為HTTP響應,術語是HTTP Reponse)。如果網站想設置Cookie,就在發回的HTTP Response中,包含一個設置Cookie的指令。舉例如下:
Set-Cookie∶ user=xxxx; Path=/; Domain= www.example.com
上述這個例子中,設置了一個Cookie。這個Cookie的“名”是user;Cookie的“值”是xxxx;Cookie綁定的域名是www.example.com
(3)瀏覽器在收到這個指令后,就會在你的電腦中存儲該Cookie的信息。
2.2.2 網站如何獲取Cookie(讀操作)
假設過了幾天之后,你再次訪問上述的www. example.com網站(在上次的訪問中,已經被設置過Cookie了)。這時候,瀏覽器發現該網址已經有對應的Cookie,就會把Cookie的信息放在HTTP Request中,然后發送到網站服務器。具體的指令如下:
Cookie∶ user=xxxx
網站服務器拿到這個HTTP Request之后,就可以通過上述信息,知道Cookie的“名”和“值”。
2.3 Cookie的特點
2.3.1 存儲信息量小
Cookie在英文中的意思就是:小甜餅。這個單詞其實已經暗示了Cookie技術所能存儲的信息量是比較小。
比如某個網站上有很多網頁,每個網頁上有很多廣告。該網站想要收集每一個訪客點擊了哪些廣告。由于這些信息量比較大,直接存儲在Cookie里可能放不下。所以,網站通常是在Cookie中保存一個惟一的用戶標識,然后把用戶的點擊信息(包括在哪個時間點擊哪個廣告)都存儲在服務器上。下次你再訪問該網站,網站先拿到Cookie中的用戶標識,因為這個標識具有惟一性,那么就可以根據該標識,從網站服務器上查出該用戶的詳細信息。
2.3.2 綁定到域名和路徑
從上述的實現機制可以看出,Cookie是跟HTTP Request對應的網址(域名和路徑)相關的。所以,不同域名的網站設置的Cookie是互相獨立的(隔離的),這一點由瀏覽器來保證,以確保安全性。
2.4 Cookie有何正經用途
Cookie之所以應用這么廣泛,因為它本身確實是很有用的。目前,很多基于Web的郵箱,都有自動登錄功能。也就是說,你第一次打開郵箱頁面的時候,需要輸入用戶名和口令,過幾天之后再來打開郵箱網頁,就不需要再次輸入用戶名和口令了。為什么郵箱可以做到自動登錄,就是因為郵箱的網站在你的瀏覽器中保存了Cookie,通過Cookie中記錄的信息來表明你是已登錄用戶。
它還能提高個性化頁面。比如某個論壇允許匿名用戶設置頁面的字體樣式和字體大小,那么,該論壇就可以把匿名用戶設置的字體信息保存在Cookie中,下次你用同一個瀏覽器訪問該論壇,自動就幫你把字體設置好了。
在Web應用中,Cookie很容易成為安全問題的一部分。從以往的經驗來看,對Cookie在開發過程中的使用,很多開發團隊并沒有形成共識或者一定的規范,這也使得很多應用中的Cookie成為潛在的易受攻擊點。在給Web應用做安全架構評審的時候,通常需要認真考慮以下幾個問題:
應用中有使用JavaScript來操作客戶端Cookie嗎?如果有,那么是否必須使用JavaScript才能完成此應用場景?如果沒有,你的Cookie允許JavaScript來訪問嗎?你的網站(可能包含多個Web應用)中,對于Cookie的域(Domain)和路徑(Path)設置是如何制定策略的?為何這樣劃分?在有SSL的應用中,你的Cookie是否可以在HTTP請求和HTTPS請求中通用?
在實際的應用場景中,Cookie被用來做得最多的一件事是保持身份認證的服務端狀態。這種保持可能是基于會話(Session)的,也有可能是持久性的。不管哪一種,身份認證Cookie中包含的服務端票據(Ticket)一旦泄露,那么服務端將很難區分帶有此票據的用戶請求是來自于真實的用戶,或者是來自惡意的攻擊者。在實際案例中,造成Cookie泄露最多的途徑,是通過跨站腳本(XSS, Cross Site Script)漏洞。攻擊者可以通過一小段JavaScript代碼,偷竊到代表用戶身份的重要的Cookie標示。由于跨站腳本漏洞是如此的普遍,幾乎每一個網站都無法避免,這種方式是被普遍使用的一種手段。
避免出現Cookie隱私問題的首要秘訣就是盡所有的可能,給你的Cookie加上HttpOnly的標簽。HttpOnly是由微軟在2000年IE6 Sp1中率先發明并予以支持的,截至目前,HttpOnly仍然只是一個廠商標準,但是在過去的10余年中,它得到了眾多瀏覽器的廣泛支持。
事實上,一個Web應用的每一個Cookie都應該帶上HttpOnly的標簽。筆者沒有看到這個決定可能帶來的負面作用,如果一定要說有的話,那么就是你的應用將不能再通過JavaScript來讀寫Cookie了。可是這真有必要嗎?筆者認為,JavaScript操作Cookie是一種不正常的做法;可以用JavaScript操作Cookie完成的功能,一樣可以用服務端響應Http頭設置Cookie來完成。相反,設置所有的Cookie為HttpOnly帶來的巨大好處則非常明顯:盡管你需要繼續修復XSS漏洞,但是這些漏洞至少暫時不會讓你的用戶遭受大規模的賬戶損失。
關于Cookie的域設置。瀏覽器在選擇發送哪些本地Cookie到本次請求的服務端時,有一系列的比較和甄別。這些甄別中最重要的部分是Domain和Path的吻合。Domain形如.abc.com的Cookie,會被發送給所有abc.com在80端口上的子域請求。但是反之則不行,這就是Cookie的域匹配(domain match)原則。
在一個大型Web站點中,往往有多個應用,生存在不同的子域名或路徑下。這些應用之間由于共享同一個域名,所以往往可能會彼此有操作對方應用Cookie的能力。這種情況下,設計好Cookie的Domain和Path尤為重要。在實際設計工作中,最重要的一個安全原則就是:最小化授權。這意味著,你需要將自己的Cookie可被訪問到的范圍降至最低。應用之間傳遞數據和共享信息的解決方案非常多,而通過Cookie這種用戶輸入(User input)來共享數據,是最不安全的解決方案之一。
Cookie另外一個不常被使用的屬性是Secure.這個屬性啟用時,瀏覽器僅僅會在HTTPS請求中向服務端發送Cookie內容。如果你的應用中有一處非常敏感的業務,比如登錄或者付款,需要使用HTTPS來保證內容的傳輸安全;而在用戶成功獲得授權之后,獲得的客戶端身份Cookie如果沒有設置為Secure,那么很有可能會被非HTTPS頁面中拿到,從而造成重要的身份泄露。所以,在你的Web站點中,如果使用了SSL,那么你需要仔細檢查在SSL的請求中返回的Cookie值,是否指定了Secure屬性。
還需特別指出的是,一些Web應用除了自己的程序代碼中生成的Cookie,往往還會從其他途徑生成一些Cookie。例如,由Web Server或者應用容器自動生成的會話Cookie,由第三方庫或者框架生成的Cookie,等等。這些都需要進行有針對性的加固處理。
幾乎每個站點都難以離開Cookie,但Cookie的使用因其貌似簡單,而很容易被人忽視。重新審視應用中的Cookie代碼,幾乎只需要很小的代價就可以獲得巨大的安全收益。
現在是互聯網大數據的時代,包括BAT(Baidu,Alibaba,Tencent)在內的大部分互聯網公司,都會在用戶不知情的情況下做著用戶數據采集和挖掘工作,目前這塊沒有立法和監督。國外的IT巨頭(如Google,Facebook)也是拼命在國會游說,推遲或者否決這方面的立法,典型的就是發動輿論和網民來組織SOPA和PIPA。
Cookie本身是一個用戶離不開的一個最基礎的規范、互聯網服務和工具。Cookie本身是無罪的,Cookie本身也沒有任何問題,有問題的是用Cookie來做事情的人和企業,就是你用它來做什么。如果你用它來提供注冊用戶所需要的個性化的服務,那是毫無疑問,這是必需的。但是,如果以Cookie為基礎,去采集用戶的瀏覽信息、瀏覽行為、興趣偏好、個人信息,包括甚至一些隱秘的個人隱私等,如果在用戶知情并許可(哪怕默許)的情況下采集之后,如果只是自己作為優化自身服務,為用戶提供更好的服務,包括一定范圍內的精準廣告,也沒有問題。但是,如果把它未經用戶許可去轉讓給第三方,或者讓第三方以Cookie為基礎來采集用戶的瀏覽行為和資訊信息等,那就有問題了。
關于Cookie的邊界和有問題的范圍其實是很清楚的,也就是一個最基本的原則,第一是知情權,第二是選擇權,第三是許可權。
知情權就是采集用戶隱私、瀏覽行為的信息,用戶必須是要知情的,不是偷偷采集;選擇權就是用戶在接受服務的過程中可以選擇,比如說開放這個權利,也可以選擇不開放這個權利,這個開關在用戶手里,不是企業手里,不能強迫用戶;許可權是指利用客戶的Cookie信息轉讓給第三方,包括把侵犯用戶個人隱私的數據做轉售,必須經用戶個人許可。
用戶本身有知情權、選擇權、許可權,用戶的這三項權利都被剝奪了,明顯就是對用戶個人信息的侵犯,利用Cookie或者利用其他信息出售給第三方,比如現在有很多聯盟廣告給小網站,就是對用戶隱私權的侵犯。
全球已經進入大數據時代,這個時代就是要精準地抓取某一方面、某一領域、某一個體所有的動向。客觀地講,從目前來看,中國整個社會的信任體制都沒有建立起來,Cookie在中國的被濫用就是很典型的一個例子。隨著互聯網的發展,隱私不可避免地變得越來越少,開放步伐是抵擋不住的,在整個社會道德體制沒有建立健全的時候,互聯網行業需要自我約束。我們要做的是盡量讓潭水變得清澈。
[1] 方霞.Cookie安全與用戶隱私研究.科技通報,2013.08.15
[2] 呂芹.Cookie∶技術無罪.互聯網周刊,2014.04.05.
[3] 滄海.Cookies可愛的洪水猛獸.電腦愛好者,2013.04.15
[4] 李馥娟.基于Cookies的Web應用分析及其安全研究.網絡安全技術與應用,2009.06
Cookies Inside Out
Lv Junhong, Zhou Jiangfeng
(department of finance of Hebei province, Shijiazhuang, 050051)
In the history of Web technology, the emergence of Cookies technology is a major change. However, the Cookie technology is a very controversial technique. Since it was born, became a controversial focus for the majority of Internet users and web developers, not for Cookie functions are too weak, but that Cookie use information of privacy of network users constitute a hazard.
network security; Cookie; privacy; Big Data; Advertising harassment
10.3969/J.ISSN.1672-7274.2015.06.011
TP393文獻標示碼:A
1672-7274(2015)06-0062-04