天天看點

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

本文主要是畢業設計"個人電腦使用記錄清除軟體"系列系統應用文章中關于cookie方面的知識,主要從介紹cookie的基礎知識和php關于cookie\session兩個會話管理機制的講述.結合自己的php課程及cookie方面的文章.提醒:由于作者寫時有點晚,思路有些亂,文章論述和排版都不太滿意,太雜亂無章,請海涵!

<一>.什麼是cookie?

cookie總是儲存在用戶端中,按在用戶端的存儲位置,分為記憶體cookie和硬碟cookie.其中記憶體cookie由浏覽器維護,儲存在記憶體中,浏覽器關閉就會消失.硬碟cookie儲存在硬碟裡,除非使用者手動清理或過期,将長期儲存.

<二>.cookie工作原理

cookie是由伺服器通過在http響應頭中加上特殊訓示生成,發送給浏覽器,浏覽器将cookie的value儲存到某目錄檔案夾内,下次請求同一網站時就發送cookie給伺服器.伺服器可以設定或讀取cookies中包含資訊,維護使用者跟伺服器會話中的狀态.其中,cookies最典型的應用是判斷使用者登入網站資訊和儲存網站輸入文字|選擇等頁面資訊.

下圖非常完美的诠釋了cookie機制.

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

<三>.windows檔案路徑(補充)

下面補充與該項目相關的浏覽器曆史記錄和cookie存儲位置,以便曆史記錄清除操作(僅以自己的電腦參考).

1.windows中cookie儲存位置為"c:\users\dell\appdata\roaming\microsoft\windows\cookies".cookie記錄使用者id、密碼、浏覽器過的網頁、停留時間等資訊.如下圖所示:

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

2.windows中internet臨時檔案位置為"c:\users\dell\appdata\local\microsoft\windows\temporary internet files",它存放着最近浏覽過的網頁的内容(網頁|圖像|媒體副本等)以便以後快速查詢并提高速度.如下圖所示:

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

3.windows中ie曆史記錄位置為"c:\users\dell\appdata\local\microsoft\windows\history",曆史記錄是存放最近時間通路過的網站位址,它以時間和站點存儲.如下圖所示:

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

<一>.什麼是session?

說到cookie,就不得不談談session.它究竟是又什麼呢?它倆的差別是什麼呢?

session(會話)是指一個終端使用者與互動系統進行通信的時間間隔,通常指從進入網站到浏覽器關閉所經過的時間.當程式需要為某個用戶端請求建立一個session時,伺服器先檢查用戶端的請求是否包含一個session唯一辨別session

id(被存儲于本地cookie中),如果包含則說明此用戶端已建立過session,伺服器就按session id把該session檢索使用;如果不包含則為此用戶端建立一個session并生成一個與session相關聯的session id(它唯一辨別符,不會重複又不容易被造訪的長串字元串).通路網站的來客配置設定的唯一辨別session id要麼存放在用戶端的cookie中(session使用過期時間設為0的cookie),要麼經由url傳遞.

補充:session是由伺服器端存儲,當使用者連接配接伺服器時會由伺服器生成一個會話id(session id),用該辨別符來存取服務端的session存儲空間.而sessionid儲存在用戶端,用cookie儲存,當使用者送出頁面時,會将sessionid送出到伺服器處理session資料.而一旦用戶端禁用cookie,session也會失效.

<二>.session和cookie對比

cookie許多用途與session相同,兩種機制儲存一些使用者互動的資訊.它們存在差別如下:

1.兩者最大的差別是cookie存儲在用戶端的一小段資訊,它完全存儲在使用者計算機上并加載到浏覽器緩存中;session資料存放在伺服器上.

2.session使用具有一定局限性,但由于資料儲存在伺服器端,提供了很好的安全性;cookie使用比較友善,但不是很安全.黑客通過存儲在本地的cookie進行cookie欺騙\跨站腳本攻擊.(http明文傳輸,https加密)

3.由于cookie存儲在本地且cookie的大小限制在4kb,對于複雜存儲需求不夠;由于session儲存在伺服器上,當通路增多時,會大量占用伺服器的性能.

<一>.設定cookie

可以用setcookie()或setrawcookie()函數設定cookie,也可以通過向用戶端直接發送http頭來設定.其中setcookie:

設定多個cookie變量setcookie('var[a]','value');用數組表示變量,用$_cookie['var']['a']來讀取該cookie變量.亦可使用header()設定cookie,讀者可自己查找資料.

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

<二>.讀取cookie

 直接用php内置超級全局變量$_cookie讀取浏覽器端的cookie.

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

可以發現使用setcookie函數設定的兩個cookie,其中cookie名稱為abc,值為123;cookie名稱為testcookie,值為something,而且它的過期時間為1小時後,并使用print_r和echo輸出.

<三>.删除cookie

 隻要把有效時間設為小于目前時間(失效時間),和把值設定為空.setcookie("testcookie","",time()-1);

結果如下圖所示,可以發現testcookie的資料已經被删除.隻剩下abc的資料.

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

在使用php登入時可以使用下面這段代碼,感覺比較實用的一段代碼:

<一>.session啟動

 使用session_start()啟用session,伺服器段在生成session檔案同時生成session id哈希值和預設phpsessid的session name,并向用戶端發送變量為phpsessid(session name),值為一個128位哈希值.伺服器端将通過該cookie與用戶端互動.

session通過cookie傳送session id,即伺服器自動發送http頭.當從該頁面跳轉到新頁面并調用session_start()後,php将檢查與給定id相關的伺服器段存儲的session資料,如未找到則建立一個新的資料集.

<二>.session通路及讀取

通過url傳送session id, 也可以通過post來傳遞session值.可以使用php内置的$_session變量可以友善的通路設定的session變量并給它指派,如$_session['xxx']='yyy'.使用echo和print_r輸出session值.

輸入如下圖所示,可以看到session id對應的長串字元串:

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

<三>.session删除

 session的删除需要三步,第一步删除伺服器端的session,第二步删除實際的session,第三部删除$_session全局變量數組.代碼如下:

C# 系統應用之Cookie\Session基礎知識及php讀取Cookie\Session

<四>.session安全問題

攻擊者通過投入很大精力擷取使用者的會話id,他們就可以在系統中擁有與此使用者相同的能力,是以校驗session id的有效性是保護session安全.下面一段代碼是我php項目時判斷資料庫mysql中session使用者名和密碼的功能(作為自己以後的筆記):

由于該“系統應用”系列文章都是采用c#語言完成,而該篇講述的php僅僅是對以前學習課程的鞏固,是對後面的采用c#讀取cookie和清除cookie等曆史記錄的前提,是以題目命名是c#.同時确實文章寫得太晚,同時思路有些亂,本應該是幾篇文章的我一篇寫完了,是以請大家見諒!該文章主要來自《lampwamp架構與開發》ppt課件,同時感謝我的cr老師和上面文章的作者.

最後希望該文章對大家有所幫助,尊重作者的勞動果實,如果有錯誤或不足之處,請大家海涵!有點後悔當初學習php和數字圖像處理時沒多寫幾篇系列文章.