JS---Cookies完整介紹 申精!

来源:互联网 发布:淘宝开店流程2016 编辑:程序博客网 时间:2024/05/17 09:14
Cookies現在經常被大家提到,那麼到底什麼是Cookies,它有什麼作用呢?Cookies是一種能夠讓網站伺服器把少量數據儲存到用戶端的硬碟或記憶體,或是從用戶端的硬碟讀取數據的一種技術。

Cookies是當你流覽某網站時,由Web伺服器置於你硬碟上的一個非常小的文字檔案,它可以記錄你的用戶ID、密碼、流覽過的網頁、停留的時間等資訊。當你再次來到該網站時,網站通過讀取Cookies,得知你的相關資訊,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登錄等等。

從本質上講,它可以看作是你的身份證。但Cookies不能作為代碼執行,也不會傳送病毒,且為你所專有,並只能由提供它的伺服器來讀取。保存的資訊片斷以"名/值"對(name-value pairs)的形式儲存,一個"名/值"對僅僅是一條命名的數據。一個網站只能取得它放在你的電腦中的資訊,它無法從其他的Cookies檔中取得資訊,也無法得到你的電腦上的其他任何東西。

Cookies中的內容大多數經過了加密處理,因此一般用戶看來只是一些毫無意義的字母數位組合,只有伺服器的CGI處理程式才知道它們真正的含義。
由於Cookies是我們流覽的網站傳輸到用戶計算機硬碟中的文字檔案或記憶體中的數據,因此它在硬碟中存放的位置與使用的作業系統和流覽器密切相關。在Windows 9X系統計算機中,Cookies檔的存放位置為C:/Windows/Cookies,在Windows NT/2000/XP的計算機中,Cookies文件的存放位置為C:/Documents and Settings/用戶名/Cookies。

硬碟中的Cookies檔可以被Web流覽器讀取,它的命令格式為:用戶名@網站位址[數位].txt。如計算機中的一個Cookies檔案名為ch@163[1].txt.要注意的是:硬碟中的Cookies屬於文字檔案,不是程式。

cookie的建立
  在講如何建立cookie之前,我們先來瞭解一下cookie的基本格式:
  cookiename+cookievalue;expire=expirationdategmt;path=urlpath;domain=sitedomain
  其中各項以;分開,首先是指定cookie的名稱,並為其賦值。接下來分別是cookie的有效期,url路徑以及域名,在這幾項中,除了第一項以外,其他部分均為可先項。
  下麵我們來看一段代碼,瞭解一下cookie究竟是怎樣建立的:
  <HTML>
  <HEAD>
  <TITLE>Set a cookie based on a form</TITLE>
  <SCRIPT LANGUAGE="java script" TYPE="TEXT/java script">
  <!-- Hide script from older browsers
  
  expireDate = new Date
  expireDate.setMonth(expireDate.getMonth()+6)
  
  userName = ""
  if (documents .cookie != "") {
  userName = documents .cookie.split("=")[1]
  }
  
  function setCookie() {
  userName = document.myform.nameField.value
  documents .cookie = "userName="+userName+";expires=" + expireDate.toGMTString()
  }
  
  // End hiding script -->
  </SCRIPT>
  </HEAD>
  <BODY BGCOLOR="WHITE" onLoad="document.myform.nameField.value = userName">
  <form NAME="myform">
  <H1>Enter your name:<INPUT TYPE="TEXT" NAME="nameField" onBlur="setCookie()"></H1>
  </form>
  </BODY>
  </HTML>
  這是一段簡單的建立cookie的腳本。
  1.<SCRIPT LANGUAGE="java script" TYPE="TEXT/java script">
  腳本開始的標記,由此一句告訴流覽器以下將是java script.
  2. <!-- Hide script from older browsers
  為了防止流覽器不能識別腳本,而讓流覽器誤以為是HTML注釋而忽略它。
  3.expireDate = new Date
  獲取當前日期,並存入變數expireDate中。
  4.expireDate.setMonth(expireDate.getMonth()+6)
  獲取當前月份值,將其加6後設置為expireDate的月份總值部分。這意味著本cookie的有效期為6個月。
  5.if (documents .cookie != "")
  如果document的值不為空,相當於檢查用戶硬碟上是否已經有了cookie。
  6.userName = documents .cookie.split("=")[1]
  此處用到了split("=")函數,它的功能是把cookie記錄分割為陣列,cookie的名為cookie[0],值為cookie[1],以此累推。所以此處documents .cookie.split("=")[1]返回的值是此cookie的值。在此句中將值賦給了變數username。
  7.function setCookie()
  設置名為setCookie的函數。
  8.documents .cookie = "userName="+userName+";expires=" + expireDate.toGMTString()
  此句是將設置好的cookie寫入用戶硬碟。expireDate.toGMTString()把expireDate中的值轉換為文本字串,這樣才能寫入cookie中。
  9.onLoad="document.myform.nameField.value = userName"
  當頁面載入時,把username的值寫入文本框(如果有的話)。
  10.onBlur="setCookie()"
  當用戶離開文本框時,onBlur調用函數setCookie。
  結合上面的注釋,讀那段代碼相信不成問題吧!既然我們可以建立cookie,那麼讀取也不是什麼難事,請接著往下看!

讀取和顯示cookie

  一般來說,cookie的作者並不希望cookie被顯示出來,這是當然的!天知道裏面寫了些什麼!?然而這也是我們想要讀出它的原因!~~~:D
  <HTML>
  <HEAD>
  <TITLE>Cookie Check</TITLE>
  </HEAD>
  <BODY BGCOLOR="WHITE">
  <H2>
  <SCRIPT LANGUAGE="java script" TYPE="TEXT/java script">
  <!-- Hide script from older browsers
  
  if (documents .cookie == "") {
  document.write("There are no cookies here")
  }
  else {
  thisCookie = documents .cookie.split("; ")
  
  for (i=0; i<thisCookie.length; i++) {
  document.write("Cookie name is ’"+thisCookie.split("=")[0])
  document.write("’, and the value is ’"+thisCookie.split("=")[1]+"’<BR>")
  }
  }
  
  // End hiding script -->
  </SCRIPT>
  </H2>
  </BODY>
  </HTML>
  以上的便是一段讀取cookie的名字和值的腳本。上文中解釋過的語句在此不多贅述,且看有什麼新的語法:
  1.thisCookie = documents .cookie.split("; ")[注意:並非前文中出現過的split("=")。
  split("; ")可以產生陣列的結果,本句中,由documents .cookie.split("; ")來獲取cookie的值,並將這個陣列賦值緞帶變數:thisCookie。
  2. for (i=0; i
  設置計算器變數i的值為0,如果其值小於thisCookie.length(thisCookie中值的個數),將i的值加1。
  3.document.write("Cookie name is ’"+thisCookie.split("=")[0])
  此句中thisCookie.split("=")[0]較難理解,上面的腳本中,thiscookie已經被賦值為一個陣列的值,那麼thisCookie是指數組中第i個值,也就是第i個cookie,而由上文可知split("=")[0]是指cookie的名字。
  這樣thisCookie.split("=")[0]便是第i的cookie中cookie的名字!
  4. document.write("’, and the value is ’"+thisCookie.split("=")[1]
  跟3極為相似,即是第i個cookie中 cookie的值。
  到此,我們已經熟悉了如何建立cookie以及它的讀取。這些也正是cookie欺騙也需要的主要技術!

Cookies的應用

幾乎所有的網站設計者在進行網站設計時都使用了Cookie,因為他們都想給流覽網站的用戶提供一個更友好的、人文化的流覽環境,同時也能更加準確地收集訪問者的資訊。

網站流覽人數管理

由於代理伺服器、緩存等的使用,唯一能幫助網站精確統計來訪人數的方法就是為每個訪問者建立一個唯一的ID。使用Cookie,網站可以完成以下工作:測定多少人訪問過;測定訪問者中有多少是新用戶(即第一次來訪),多少是老用戶;測定一個用戶多久訪問一次網站。

通常情況下,網站設計者是借助後臺數據庫來實現以上目的的。當用戶第一次訪問該網站時,網站在數據庫中建立一個新的ID,並把ID通過Cookie傳送給用戶。用戶再次來訪時,網站把該用戶ID對應的計數器加1,得到用戶的來訪次數或判斷用戶是新用戶還是老用戶。

按照用戶的喜好定制網頁外觀

有的網站設計者,為用戶提供了改變網頁內容、佈局和顏色的權力,允許用戶輸入自己的資訊,然後通過這些資訊對網站的一些參數進行修改,以定制網頁的外觀。

在電子商務站點中實現諸如"購物籃"等功能

可以使用Cookie記錄用戶的ID,這樣當你往"購物籃"中放了新東西時,網站就能記錄下來,並在網站的數據庫裏對應著你的ID記錄當你"買單"時,網站通過ID檢索數據庫中你的所有選擇就能知道你的"購物籃"裏有些什麼。

  在一般的事例中,網站的數據庫能夠保存的有你所選擇的內容、你流覽過的網頁、你在表單裏填寫的資訊等;而包含有你的唯一ID的Cookie則保存在你的電腦裏。

Cookies的缺陷

  Cookie雖然被廣泛的應用,並能做到一些使用其他技術不可能實現的功能。但也存在一些不夠完美的方面,給應用帶來不便。
多人共用一台電腦的問題

  任何公共場合的電腦或者許多在辦公室或家裏使用的電腦,都會同時被兩個以上的人使用。這樣,當你用它在網上超市購物時,網上超市或網站會在這台機器上留下一個Cookie,將來也許就會有某個人試圖使用你的帳戶購物,帶來了不安全的可能。當然,在一些使用多用戶作業系統如Windows NT或UNIX的電腦上,這並不會成為一個問題。因為在多用戶作業系統下不同的帳戶的Cookie分別放在不同的地方。
  
Cookies被刪除時

假如你的流覽器不能正常工作,你可能會刪除電腦上所有的臨時Internet檔。然而,一旦這樣操作以後,你就會丟掉所有的Cookies檔。當你再次訪問一個網站時,網站會認為你是一位新用戶並分配給你一個新的用戶ID以及一個新的Cookie。結果將會造成網站統計的新老用戶比發生偏差,而你也難以恢復過去保存的參數選擇。

一人使用多台電腦時

有的人一天之中經常使用一台以上的電腦。例如在辦公室裏有一台電腦、家裏有一台、還有移動辦公用的筆記本電腦。除非網站使用了特別的技術來解決這一問題,否則,你將會有三個不同的Cookies檔在這三台機器上,而在三台機器上訪問過的任何網站都將會把你看成三個不同的用戶。

COOKIE欺騙原理

按照流覽器的約定,只有來自同一域名的cookie才可以讀寫,而cookie只是流覽器的,對通訊協定無影響,所以要進行cookie欺騙可以有多種途徑:
1、跳過流覽器,直接對通訊數據改寫
2、修改流覽器,讓流覽器從本地可以讀寫任意域名cookie
3、使用簽名腳本,讓流覽器從本地可以讀寫任意域名cookie(有安全問題)
4、欺騙流覽器,讓流覽器獲得假的域名
其中:
方法1、2需要較專業的編程知識,對普通用戶不太合適。
方法3的實現有2種方法:
1、直接使用簽名腳本,不需要簽名驗證,但是產生很嚴重的安全問題,因為大家都要上網的,如果這樣做你的硬碟檔就……
2、對腳本進行簽名後再使用簽名腳本,但是需要專用的數位簽名工具,對普通用戶也不合適。
方法4看樣子應該是最合適的了,域名欺騙很簡單,也不需要什麼工具(當然如果你的機器裝有web伺服器那更好了),下麵我以the9為例,以這種方法為基礎,闡述一下cookie欺騙的過程(下文中提到的任何服務端的bug,the9都已經做了改進,所以本文對the9無安全方面的影響):

注:我們討論的cookie是那種不會在硬碟的cookie檔裏留下蹤跡的cookie,就是那種只在流覽器生存週期內(會話)產生的cookie,如果流覽器關閉(會話結束)那麼這個cookie就被刪了!

cookie欺騙的實現

  要做到cookie欺騙,最重要的是理解目標cookie中的儲值情況,並設法改變它。由上面的學習我們知道,基於cookie的格式所限,一般來說,只有在Cookie.split("=")[0]和Cookie.split("=")[1]中的值對我們才是有用的。也就是說只需改變這兩處或是處的值即可達到我們的目的。

  而在實際操作中,還得先解決另一個問題。由於受流覽器的內部cookie機制所限,每個cookie只能被它的原伺服器所訪問!可我們總不能跑到人家伺服器上操作吧!這裏就需要一個小技巧了。

  在上面我們提到過cookie的格式,最後兩項中分別是它的url路徑和域名。不難想到,伺服器對cookie的識別靠的就是這個!

  而在平時,我們要流覽一個網站時,輸入的url便是它的域名,需要經過域名管理系統dns將其轉化為IP位址後進行連接的。這其中就有一個空當。如果能在dns上做手腳,把目標域名的IP位址對應到其他站點上,我們便可以非法訪問目標站點的cookie了!

  做到這一點並不難,當然我不並不是要去操縱dns,而且那也是不可能的事情。在win9下的安裝目錄下,有一 名為hosts.sam的檔,以文本方式打開後會看到這樣的格式:
  127.0.0.1 lockhost #注釋
  利用它,我們便可以實現域名解析的本地化!而且其優先權高於網絡中的dns!
  具體使用時,只需將IP和域名依上面的格式添加,並另存為hosts即可!(注意:此文件無後贅名,並非hosts.sam 檔本身!)
  到此,cookie欺騙所需的所以知識已經齊備。下麵以一個“假”的例子,演示一下如何進入實戰.(不便給出真實地址,以免引起犯罪!~~~:P)
  假設目標站點是 www.xxx.com
  www.self.com是自己的站點。(可以用來存放欺騙目標所需的檔,用來讀取和修改對方的cookie.)
  首先ping出www.self.com的IP地址:
  ping www.self.com
  Reply from 12.34.56.78: bytes=32 time=20ms TTL=244
  然後修改hosts.sam文件如下:
  12.34.56.78 www.xxx.com
  並保存為hosts。
  將用來讀取cookie的頁面傳至www.self.com(腳本如二所示)。
  此時連上www.xxx.com。由於我們已經對hosts動過手腳,這時來到的並不是www.xxx.com,而是www.self.com
  www.xxx.com設在本地的cookie便可被讀出!~~:D
  然後根據具體情況修改一的腳本,用同樣的方法,向此cookie中寫入數據。修改完畢後,刪掉hosts檔,再重新進入www.xxx.com,此時已經大功告成,可享受你的hack成果了!~~~:)

ie的cookie漏洞:

如果你用的是ie的話,由於ie本身的漏洞,你大可不必編輯hosts,就可以同樣做到讀寫別的域名的cookie,你可以使用以下的方法欺騙ie:
假設你的主頁文件為http://a.com/cookie.htm
使用以下url: http://a%2Ecom%2Fcookie%2Ehtm%3F.xxx.com
如果直接輸在流覽器地址欄裏不行,就作個script,把location的值設為這個就可以了!
這個位址轉換後應該是這樣的: http://a.com/cookie.htm?.xxx.com
由於ie的bug,誤把前面那個的域名以為是.xxx.com了!

hosts檔解釋

hosts檔實際上可以看成一個本機的dns系統,它可以負責把域名解釋成ip位址,它的優先權比dns伺服器要高,它的具體實現是TCP/IP協議中的一部分。
如果有這麼一行:
202.109.110.3 www.xxx.com
那麼在輸入www.xxx.com時,網絡協議會首先檢查hosts檔找到匹配的,如果找不到再去dns查,這樣你訪問www.xxx.com實際上是訪問202.109.110.3,而不是通常的202.109.110.2。
注:由於緩存的作用,如果開著流覽器編輯hosts的話,hosts裏的內容有可能不會當場生效,你可以重新啟動流覽器或等一會時間再試一下!

防範Cookies洩密

想知道你訪問的網站是否在你的硬碟或記憶體中寫入了Cookies資訊嗎?只需執行下麵的操作步驟,就可以瞭解和控制你正在訪問的網站的Cookies資訊。

步驟一點擊IE視窗中的"工具" "In-ernet選項",打開"Internet選項"設置視窗;

步驟二點擊"Internet選項"設置視窗中的"安全"標籤,然後再點擊"自定義級別"按鈕,進入"安全設置"窗口;

步驟三 找到"安全設置"視窗中的"Cookies"設置項。"Cookies"設置項下有兩個分選項,其中"允許使用存儲在您計算機上的ookies"是針對存儲在用戶計算機硬碟中的Cookies檔;"允許使用每個對話Cookies(未存儲)"是針對存儲在用戶計算機記憶體中的Cookies資訊。

存儲在硬碟中的Cookies檔是永久存在的,而存儲在記憶體中的Cookies資訊是臨時的。

要想IE在即將接收來自Web站點的所有Cookies時進行提示,可分別選擇上面兩個分選項中的"提示"項。

當然,你也可以選擇"啟用",允許IE接受所有的Cookies資訊(這也是IE的默認選項);選擇"禁止",則是不允許Web站點將Cookies存儲到您的計算機上,而且Web站點也不能讀取你計算機中已有的Cookies。

IE6.0提供了更為可靠的個人隱私及安全保護措施,可以讓用戶來控制流覽器向外發送資訊的多少。在"Internet 選項"窗口中新增了"隱私"選項卡,用戶可以在其中直接設置流覽時的隱私級別,按需要控制其他站點對自己電腦所使用的Cookies。

如果我們正在流覽的站點使用了Cookie,那麼在流覽器狀態欄中會有一個黃色驚嘆號的標記,雙擊後可打開"隱私報告"對話方塊,用戶可以在其中查看具體的隱私策略,還可直接點擊"設置"按鈕後在上述"隱私"選項卡中調節安全隱私級別。

在"常規"選項卡中還增加了"刪除Cookies"按鈕(圖2),方便用戶直接清除本機上的Cookies。另外,在"工具" "選項" "高級"選項卡中也增加了一些進一步提高安全性的選項(如關閉流覽器時清空Internet暫存檔案)。其實,如何更好地保護個人隱私和安全是微軟下一代".NET"戰略軟體中的關鍵技術,現在IE6.0已經嘗試著邁出了第一步。

另外,由於Cookies的資訊並不都是以檔形式存放在計算機裏,還有部分資訊保存在記憶體裏。比如你在流覽網站的時候,Web伺服器會自動在記憶體中生成Cookie,當你關閉IE流覽器的時候又自動把Cookie刪除,那樣上面介紹的兩種方法就起不了作用,我們需要借助註冊表編輯器來修改系統設置。要注意的是,修改註冊表前請作備份,以便出現問題後能順利恢復。

運行Regedit,找到如下鍵值:

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Internet Settings/Cache/Special Paths/Cookies,這是Cookies在記憶體中的鍵值,把這個鍵值刪除。至此Cookies無論以什麼形式存在,我們都不用再害怕了。
最後有必要說明的一點是:杜絕Cookies雖然可以增強你電腦的資訊安全程度,但這樣做同樣會有一些弊端。比如在一些需要Cookies支援的網頁上,會發生一些莫名其妙的錯誤,典型的例子就是你以後不能使用某些網站的免費信箱了。

Cookies集合具有以下幾種屬性:

1.Expires屬性:此屬性用來給Cookies設置一個期限,在期限內只要打開網頁就可以調用被保存的Cookies,如果過了此期限Cookies就自動被刪除。如:設定Cookies的有效期到2004年4月1日,到時將自動刪除。如果一個Cookies沒有設定有效期,則其生命週期從打開流覽器開始,到關閉流覽器結束,每次運行後生命週期將結束,下次運行將重新開始。
2.Domain屬性:這個屬性定義了Cookies傳送數據的唯一性。
3.Path屬性:定義了Cookies只發給指定的路徑請求,如果Path屬性沒有被設置,則使用應用軟體的缺省路徑。
4.Srcure屬性:指定Cookies能否被用戶讀取。
5.Haskeys屬性:如果所請求的Cookies是一個具有多個鍵值的Cookies字典,則返回True,它是一個唯讀屬性。
 
原创粉丝点击