NO IMAGE

 http://www.51testing.com/?uid-46301-action-viewspace-itemid-65191

Cookie和會話狀態的工作原理及Cookie欺騙  

session是一種儲存上下文資訊的機制,它是針對每一個使用者的,變數的值儲存在伺服器端,通過SessionID來區分不同的客戶,session是以Cookie或URL重寫為基礎。預設使用Cookie來實現,系統會創造一個名為JSESSIONID的輸出Cookie,或稱為”Session Cookie”,以區別Persistent Cookies(通常所說的Cookie).Session Cookie是儲存在瀏覽器中,並不是寫在硬碟上的,但是把瀏覽器的Cookie禁止後,使用response物件的encodeURL或encodeRedirectURL方法編碼URL,WEB伺服器會採URL重寫的方式傳遞Sessionid,使用者就可以在位址列看到jsessionid=A09JHGHKHU68624309UTY84932之類的字串。
 
通常Session Cookie是不能跨視窗使用,當使用者新開了一個瀏覽器進入相同的頁面時,系統會賦予使用者一個新的SessionID,這樣資訊共享的目的就達不到,此時可以把SessionID儲存在Persistent Cookie中,然後再新的視窗中讀出來,就可以得到上一個視窗的SessionID了,這樣通過Session Cookie和Persistent Cookie的結合,實現了跨視窗的會話跟蹤。

session的工作原理
就session的實現而言,好像是這樣的:
(1)當有Session啟動時,伺服器生成一個唯一值,稱為SessionID(好像是通過取程序ID的方式取得的)。
(2)然後,伺服器開闢一塊記憶體,對應於該SessionID。
(3)伺服器再將該SessionID寫入瀏覽器的cookie(一些在網頁的原始碼中有所體現)。
(4)伺服器內有一程序,監視所有Session的活動狀況,如果有Session超時或是主動關閉,伺服器就釋放該記憶體塊。
(5)當瀏覽器連入IIS(伺服器)時並請求的ASP(指令碼語言)內用到Session時,IIS(伺服器)就讀瀏覽器Cookie中的SessionID。
(6)然後,服務檢查該SessionID所對應的記憶體是否有效。
(7)如果有效,就讀出記憶體中的值。
(8)如果無效,就建立新的Session。

注意:
(1)在大瀏覽量的網站,Session並不保險,我們過去的網站就經常碰到存在Session中得值不正確(可能出現重複的Session ID)。
(2)Session ID不能從硬碟上的Cookie檔案獲得,如果想在客戶端獲知自己的Session ID,只能通過Javascrīpt來讀取。

 

Cookie和會話狀態
做BS開發,這兩個概念必不可少,先來個大概瞭解,沒有實際應用很難深入,深入看參考地址!
什麼是 Cookie?
Cookie 是一小段文字資訊,伴隨著使用者請求和頁面在 Web 伺服器和瀏覽器之間傳遞。使用者每次訪問站點時,Web 應用程式都可以讀取 Cookie 包含的資訊。 Cookie 的基本工作原理如果使用者再次訪問站點上的頁面,當該使用者輸入 URLwww.*****.com時,瀏覽器就會在本地硬碟上查詢與該 URL 相關聯的 Cookie。如果該 Cookie 存在,瀏覽器就將它與頁面請求一起傳送到您的站點。

Cookie 有哪些用途?
最根本的用途是:Cookie 能夠幫助 Web 站點儲存有關訪問者的資訊。更概括地說,Cookie 是一種保持Web 應用程式連續性(即執行“狀態管理”)的方法.使 Web 站點記住您.

什麼是會話Session?
當使用者訪問您的站點時,伺服器會為該使用者建立唯一的會話,會話將一直延續到使用者訪問結束。

 

參考地址
http://www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies101.asp
http://support.microsoft.com/default.aspx?scid=kb;en-us;307598

 

cookie欺騙原理

正如我們所知道的,在網路詞彙中,cookie是一個特殊的資訊,雖然只是伺服器存於使用者計算機上的一個文字檔案,但由於其內容的不尋常性(與伺服器有一定的互交性,且常會儲存使用者名稱,甚至口令,或是其它一些敏感資訊,例如在江湖或是一些社群中,常會用cookie來儲存使用者集分,等級等等)。因而成為一些高手關注的物件,藉此來取得特殊許可權,甚至攻克整個網站。以下是自己在xp,2003上做過的測試關於javascrīpt中對cookie的應用。

一、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> 
<scrīpt LANGUAGE=javascrīpt>
<!–
expireDate = new Date;
expireDate.setMonth(expireDate.getMonth() 6);
userName = “” ;
if (document.cookie!=””) {
userName =document.cookie.split(“=”)[1];
}
function nameField_onblur() {
var userName;
userName=document.myform.nameField.value;
document.cookie=”userName=” userName “;expires=” expireDate.toGMTString();
alert(document.cookie);
}
//–>
</scrīpt></HEAD>
<BODY BGCOLOR=”WHITE” ōnLoad=”document.myform.nameField.value = userName”>
<form NAME=”myform”>
<H1>Enter your name:
<INPUT TYPE=”TEXT” NAME=”nameField” ōnBlur=”return nameField_onblur()”></H1>
</form></BODY></HTML>

1,<scrīpt LANGUAGE=”java scrīpt” TYPE=”TEXT/javascrīpt”>
指令碼開始的標記,由此一句告訴瀏覽器以下將是javascrīpt.
2,<!– Hide scrīpt from older browsers
為了防止瀏覽器不能識別指令碼,而讓瀏覽器誤以為是HTML註釋而忽略它。
3,expireDate = new Date
獲取當前日期,並存入變數expireDate中。
4,expireDate.setMonth(expireDate.getMonth() 6)
獲取當前月份值,將其加6後設定為expireDate的月份總值部分。這意味著本cookie的有效期為6個月。
5,if (document.cookie != “”)
如果document的值不為空,相當於檢查使用者硬碟上是否已經有了cookie。
6,userName = document.cookie.split(“=”)[1]
此處用到了split(“=”)函式,它的功能是把cookie記錄分割為陣列,cookie的名為cookie[0],值為cookie[1],以此類推。所以此處document.cookie.split(“=”)[1]返回的值是此cookie的值。在此句中將值賦給了變數userName。
7,function nameField_onblur()()
設定名為nameField_onblur()的函式。
8,document.cookie = “userName=” userName “;expires=” expireDate.toGMTString()
此句是將設定好的cookie寫入使用者硬碟。expireDate.toGMTString()把expireDate中的值轉換為文字字串,這樣才能寫入cookie中。
9,onLoad=”document.myform.nameField.value = userName”
當頁面載入時,把username的值寫入文字框(如果有的話)。
10,onBlur=”nameField_onblur()”
當使用者離開文字框時,onBlur呼叫函式nameField_onblur()。
既然我們可以建立cookie,那麼讀取也不是什麼難事,請接著往下看!

二、讀取和顯示cookie

一般來說,cookie的作者並不希望cookie被顯示出來,這是當然的!天知道里面寫了些什麼!?然而這也是我們想要讀出它的原因!~~~:D
<HTML><HEAD><TITLE>Cookie Check</TITLE></HEAD>
<BODY BGCOLOR=”WHITE”>
<H2>
<scrīpt LANGUAGE=javascrīpt> 
<!– Hide scrīpt from older browsers
var thisCookie;
if (document.cookie == “”) {
document.write(“There are no cookies here”);
}
else {
thisCookie = document.cookie.split(“;”);
for (i=0; i<thisCookie.length; i ) {
document.write(“Cookie’length is ” thisCookie.length “<br>”);
document.write(“Cookie name is ’” thisCookie[i].split(“=”)[0]);
document.write(“’, and the value is ’” thisCookie[i].split(“=”)[1] “’<BR>”);
}
}
// End hiding scrīpt –>
</scrīpt>
</H2></BODY></HTML>

以上的便是一段讀取cookie的名字和值的指令碼。上文中解釋過的語句在此不多贅述,且看有什麼新的語法:
1,thisCookie = document.cookie.split(“;”)[注意:並非前文中出現過的split(“=”)。
split(“;”)可以產生陣列的結果,本句中,由document.cookie.split(“;”)來獲取cookie的值,並將這個陣列賦值。
2,for (i=0; i<thisCookie.length; i ) 
設定計算器變數i的值為0,如果其值小於thisCookie.length(thisCookie中值的個數),將i的值加1。
3,document.write(“Cookie name is ’” thisCookie[i].split(“=”)[0])
此句中thisCookie[i].split(“=”)[0]較難理解,上面的指令碼中,thiscookie已經被賦值為一個陣列的值,那麼thisCookie[i]是指陣列中第i個值,也就是第i個cookie,而由上文可知split(“=”)[0]是指cookie的名字。
這樣thisCookie[i].split(“=”)[0]便是第i的cookie中cookie的名字!
4,document.write(“’, and the value is ’” thisCookie[i].split(“=”)[1]
跟3極為相似,即是第i個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,而且那也是不可能的事情。在xp,2003下的C:/WINDOWS/system32/drivers/etc,有一名為hosts的檔案,以文字方式開啟後會看到這樣的格式:
127.0.0.1 lockhost #註釋
利用它,我們便可以實現域名解析的本地化!而且其優先權高於網路中的dns!
具體使用時,只需將IP和域名依上面的格式新增,存為hosts即可!(注意:此檔案無字尾名)
到此,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檔案如下:
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成果了!~~~:)

編後

cookie欺騙是一種發現較早,且較難使用的hack手法,除了javascrīpt 可以控制以外,asp等也可以用來對其進行設定。所以在此宣告,未必能對所有站點有效。但技術真實,無須置疑!

http://www.cnblogs.com/joeliu/archive/2008/01/10/1033232.html

Cookies基礎  
  Cookies是web站點放置到你的硬碟上的程式。它們駐留在你的計算機上收集關於你在因特網上所做的一切事情的資訊,並且web站點可以在任何時候讀取到Cookies收集到的所有資訊。  
  在新聞中這樣定義是公平的,問題是,這個定義中沒有一個是正確的,Cookies不是程式,它不能象程式一樣能做很多事,因此它們自己不能收集任何資訊,也不能收集關你你的機器的任何資訊。  
   
  這裡有一個關於Cookies的比較恰當的定義:  
   
  一個Cookies是web伺服器存放在使用者硬碟的一段文字,Cookies允許一個wen站點在使用者的機器存放一些文字的資訊,並可以在以後重新獲取它。這個基於文字的資訊儲存著一些“鍵-值”對。  
   
  舉個例子,一個web站點要為每一個來訪者建立一個唯一的ID號碼,並且將這個號碼儲存到每個來訪者的機器的Cookies中。  
   
  如果你用微軟的IE瀏覽一個web,你能夠在你的硬碟看到你機器上的所有的Cookies,通常它們會駐留在目錄c:/windows/cookies (win98),或者C:/Documents   and   Settings/user   name/Cookies(win2000,win   xp)   下面,當我看我的機器的這個目錄的時候,我發現有165個檔案。每個都是一個包含了“鍵-值”對的文字檔案,每個站點都有一個Cookies檔案。  
   
  你能夠看到這個目錄中的每一個檔案都是一個簡單的,普通的文字檔案,你能夠通過檔名看到是哪個web站點在你的機器放置了Cookies(這個資訊也儲存在了檔案內容中),你可以開啟每個檔案檢視其內容。  
   
  例如,我已經訪問過了站點   goto.com,這個站點就會在我的機器上放置一個Cookie,這個Cookie檔案的名字叫goto.com,包含下面的資訊:  
  UserID   A9A3BECE0563982D   www.goto.com/站點   goto.com已經在我的機器上放置了一個單個的“鍵-值”對,鍵的名字是   UserID,鍵的值是   A9A3BECE0563982D,我第一次訪問goto.com站點,站點分配了一個唯一的ID給我並把這個ID存放到了我的機器。  
   
  大多數的站點僅僅只在你的機器存放一個使用者ID的Cookie,但這不是限制,一個站點可以在你的機器存放許多的“鍵-值”對,只要它喜歡。  
   
  Cookies檔案只包含這些簡單的“鍵-值”對的文字,、它不是程式,因此它不能“做”任何事情,一個web站點只能重新取得它自己放置到你硬碟的資訊,它不能從其它的Cookies檔案中取得資訊,也不能看到你的機器的任何別的東西

Cookies資料如何移動  
   
  正如你在以上章節中看到的,Cookie資料是簡單的web站點放置在你的硬碟上的“鍵-值”對的文字,所有的Cookies檔案都是如此。Web站點儲存這些資料,然後又可以取回來,一個web站點只能取回它自己存放在你機器的資料,不能看到其它的Cookie,也不能看到你機器上的其它任何東西。  
   
  Cookie資料按照下面的方式移動:  
   

  1. 如果你在你的瀏覽器中輸入了web的URL,瀏覽器會象這個URL的web站點傳送請求,比如,你在瀏覽器中輸入一下URL:http: //www.verizon.com,瀏覽器會將請求傳送到Verizon的web伺服器,請求它的首頁。  
  2.  當瀏覽器傳送請求時,它會檢視你機器上跟域名www.verizon.com有關的Cookie檔案,如果存在同www.verizon.com有關的 Cookie,瀏覽器就會把相關的Cookie“鍵-值”對資料跟請求一起傳送到伺服器,如果不存在同www.verizon.com有關的 Cookie,則瀏覽器不傳送Cookie到伺服器。  
  3. Verizon的web伺服器收到Cookies資料和一個頁面的Http請求,如果收到了Cookie“鍵-值”對,Verizon的web伺服器將能夠使用它們。  
  4. 如果沒有收到Cookie“鍵-值”對,Verizon的web伺服器就能知道你以前沒有訪問過這個站點,伺服器建立一個新的使用者ID,並在把你所請求的 頁面發回到你的瀏覽器時,把使用者ID“鍵-值”對傳送到你的機器,你的硬碟就會駐留了對應這個站點的“鍵-值”對Cookie。  
  5. web伺服器可以在你訪問站點時,隨時的更改“鍵-值”對或者加入一個新的“鍵-值”對。  
  6. 同“鍵-值”對傳送到客戶端的還有同這個“鍵-值”對相關的一些其它資訊,其中之一就是Cookie有效期,另一個就是路徑(為了在同一個站點的不通部分關聯不同的Cookie)。  

   
  你能夠控制這個過程,你可以在你的瀏覽器中設定當web站點向你的機器傳送Cookie時你是接受還是拒絕。

Web站點怎麼使用Cookies    
   
  Cookies得到發展是因為它解決了誰在訪問某個站點這個大問題,廣義的理解,Cookies允許一個站點在你的機器上儲存狀態資訊,這個資訊讓web 站點記住你的瀏覽器在什麼狀態,一個userID這個簡單的“鍵-值”對可以讓web站點知道你以前訪問過這個站點,狀態就是“你的瀏覽器至少訪問過這個站點一次”,並且,站點從這次訪問可以得知你的user   ID。  
   
  Web站點通過許多不通的方法來使用Cookies,下面是一些例子:    
   

  1. 站點能夠精確的知道有多少訪問者在實際的訪問站點,它能排除哪些因為代理伺服器,緩衝器,集中器等等帶來的干擾,正確統計站點訪問數的唯一方法是為每一個 來訪者設定一個唯一的ID,並存在Cookie中,用Cookie,站點能夠:  
  2. 決定有多少訪問者到達。  
  3. 決定多少新的訪客,多少是再次造訪者。  
  4. 確定一個訪問者訪問的頻度  

   
  web站點要做到這些是通過使用一個資料庫,一個來訪者第一次到來,站點在資料庫中建立一個新的user   ID,並且將這個user   ID做為Cookie傳送到客戶端,這個使用者下次再次訪問這個站點,站點將會在資料庫中同這個使用者關聯的user   ID   記錄中增加訪問次數,因此也知道了此使用者多久訪問一次。    
   
    為了檢視每個使用者的不同之處,站點可以儲存使用者的引數,比如,一些站點提供改變內容、佈局、顏色設定的能力,它或者能夠根據你的郵政編碼提供定製的天氣資訊。  
   
  大多數的站點似乎都象這樣的在站點資料庫中儲存使用者引數,在Cookie中除了儲存一個user   ID別的資訊都沒有,但是要在“鍵-值”對中儲存一個實際的值還有另外一個方法:    
   
    電子商務站點能夠實現類似購物藍和快速付款這些功能,用包含user   ID的Cookie來跟蹤客戶並將不同的商品放入你的購物藍中,你放入購物藍的每一個商品都將存放在資料庫中同你的user   ID相關的記錄中,當你付款時,站點知道你都採購了哪些商品。若是沒有Cookie或者類似的技術,將不可能實現上述的功能。  
   
  在所有的這些例子中,注意,資料庫被用來儲存你在站點中選擇的商品,你瀏覽過的頁面,你在表單中提供的資訊等等,所有的資訊都被儲存在站點的資料庫中,只有你的user   ID是儲存在客戶端的Cookie中用以辨識使用者的身份。
  
Cookies的問題  
   
     
   
  Cookies不是一種理想的狀態機,但是它的確能夠做到許多別的方式不能做到的事,下面是Cookies的一些缺點:  
   
     
   

  1. 人們經常共同使用一臺機器   ――   在公共場合使用的任何機器,和在辦公室使用的或在家中使用的許多機器都是多人共享的機器。讓我們來看你正在使用一臺多人使用的機器(例如,在圖書館的機 器)在一個網上商店購買商品,商店的網站將會在這個機器上留下你的一些設定資訊,其後又有別人用這臺機器到這個網上商店購買商品,這個網站將會提供的是你 的一些設定。  
  2. Cookies   被刪除   ――   如果你的瀏覽器出來問題而尋求技術支援的時候,技術支持者要你做的第一件事就是要求你首先刪除你機器上的所有internet臨時檔案,當你這樣做後,你 將丟掉你的所有的Cookies檔案。當你再次訪問某個站點時,站點將會想你是個新的使用者並給你一個新的user   ID,你以前在這個站點設定的一些個性設定也將不在存在。  
  3. 使用多個機器   ――   人們在一天之內經常使用不止一臺機器,比如,在辦公室使用一臺機器,在家又使用一臺機器,在路上可能使用到膝上型電腦。這樣在三臺機器上將會用三個不通的 Cookie,同一個人在三臺機器上將會被做為三個使用者分別對待。