C# 係統應用之Cookie\Session基礎知識及php讀取Cookie\Session
本文主要是畢業設計"個人電腦使用記錄清除軟件"係列係統應用文章中關於Cookie方麵的知識,主要從介紹Cookie的基礎知識和PHP關於Cookie\Session兩個會話管理機製的講述.結合自己的PHP課程及Cookie方麵的文章.提醒:由於作者寫時有點晚,思路有些亂,文章論述和排版都不太滿意,太雜亂無章,請海涵!
一. cookie基礎知識
<一>.什麼是Cookie?
Cookie/Cookies置某些網站為了辯護用戶身份而存儲在本地終端(Client Side)上的數據(通常加密),它是一種在遠程瀏覽器端儲存數據並以此來跟蹤和識別用戶的機製.(詳見維基百科https://zh.wikipedia.org/wiki/Cookie)
Cookie總是保存在客戶端中,按在客戶端的存儲位置,分為內存Cookie和硬盤Cookie.其中內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉就會消失.硬盤Cookie保存在硬盤裏,除非用戶手動清理或過期,將長期保存.
<二>.Cookie工作原理
Cookie是由服務器通過在HTTP響應頭中加上特殊指示生成,發送給瀏覽器,瀏覽器將Cookie的value保存到某目錄文件夾內,下次請求同一網站時就發送Cookie給服務器.服務器可以設置或讀取Cookies中包含信息,維護用戶跟服務器會話中的狀態.其中,Cookies最典型的應用是判斷用戶登錄網站信息和保存網站輸入文字|選擇等頁麵信息.
下圖非常完美的詮釋了Cookie機製.
<三>.Windows文件路徑(補充)
下麵補充與該項目相關的瀏覽器曆史記錄和Cookie存儲位置,以便曆史記錄清除操作(僅以自己的電腦參考).
1.Windows中Cookie保存位置為"C:\Users\dell\AppData\Roaming\Microsoft\Windows\Cookies".Cookie記錄用戶ID、密碼、瀏覽器過的網頁、停留時間等信息.如下圖所示:
2.Windows中Internet臨時文件位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\Temporary Internet Files",它存放著最近瀏覽過的網頁的內容(網頁|圖像|媒體副本等)以便以後快速查詢並提高速度.如下圖所示:
3.Windows中IE曆史記錄位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\History",曆史記錄是存放最近時間訪問過的網站地址,它以時間和站點存儲.如下圖所示:
二. 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保存在服務器上,當訪問增多時,會大量占用服務器的性能.
(該部分參考資料:學校《LAMPWAMP架構與開發》PPT課件\文章https://www.2cto.com/kf/201206/135471.html)
三. PHP使用Cookie
<一>.設置cookie
可以用setcookie()或setrawcookie()函數設置cookie,也可以通過向客戶端直接發送http頭來設置.其中setcookie:
//函數向客戶端發送一個http cookie bool setcookie( string name, //必填 cookie變量名稱 string value, //必填 cookie變量值 int expire, //可選 cookie有效期結束時間 string path, //可選 cookie被發送到服務器的目錄路徑 string domain, //可選 cookie域名 int secure //可選 是否通過https加密鏈接傳輸cookie )
設置多個cookie變量setcookie('var[a]','value');用數組表示變量,用$_COOKIE['var']['a']來讀取該COOKIE變量.亦可使用header()設置cookie,讀者可自己查找資料.
//設置cookie名稱為abc 值為123 setcookie("abc","123"); //設置TestCookie的有效期為3600秒 time()返回當前時間 $value='something'; setcookie("TestCookie",$value,time()+3600); //設置完整的Cookie setcookie("TestCookie",$value,time()+3600,"/forum","www.baidu.com",1);
使用XAMPP配置PHP環境後(配置過程可參考:https://blog.csdn.net/eastmount/article/details/11823549),通過Firefox火狐瀏覽器和Firebug插件運行結果如下圖所示:
<二>.讀取cookie
直接用php內置超級全局變量$_COOKIE讀取瀏覽器端的cookie.
<?php //設置TestCookie的有效期為3600秒 $value='something'; setcookie("TestCookie",$value,time()+3600); //print_r打印數組變量 echo '<pre>'; print_r($_COOKIE); //echo輸出一個或多個字符串 echo $_COOKIE["TestCookie"]; ?>
注意:如果使用echo $HTTP_COOKIE_VARS["TestCookie"]輸出變量時,可能會提示錯誤:"Undefined variable: HTTP_COOKIE_VARS",因為新的版本已棄用$HTTP_COOKIE_VARS,用$_COOKIE替代輸出.如下圖所示:
可以發現使用setcookie函數設置的兩個Cookie,其中Cookie名稱為abc,值為123;Cookie名稱為TestCookie,值為something,而且它的過期時間為1小時後,並使用print_r和echo輸出.
<三>.刪除cookie
隻要把有效時間設為小於當前時間(失效時間),和把值設置為空.setcookie("TestCookie","",time()-1);
<?php //刪除cookie 設置cookie過期時間 setcookie("TestCookie","",time()-1); //print_r打印數組變量 echo '<pre>'; print_r($_COOKIE); ?>
結果如下圖所示,可以發現TestCookie的數據已經被刪除.隻剩下abc的數據.
在使用PHP登錄時可以使用下麵這段代碼,感覺比較實用的一段代碼:
<?php if(!isset($_COOKIE['name'])) //檢測cookie變量是否設置 { header('location:index.php'); //跳轉回主頁 die(); //退出當前腳本 } else { echo 'Hello:'.$_COOKIE['name']; } ?>
(該部分參考資料:學校《LAMPWAMP架構與開發》PPT課件\博客https://www.jb51.net/article/24871.htm)
四. PHP使用Session
<一>.session啟動
使用session_start()啟用session,服務器段在生成session文件同時生成session ID哈希值和默認PHPSESSID的session name,並向客戶端發送變量為PHPSESSID(session name),值為一個128位哈希值.服務器端將通過該cookie與客戶端交互.
<?php session_start(); //函數沒有參數且返回值為true.最好將函數置於最先,且它之前不能有任何輸出,否則會警告 ?>
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值.
<?php //啟動session session_start(); echo 'Welcome to session'; /*創建session變量並給session變量賦值*/ $_SESSION['favcolor'] = 'green'; $_SESSION['animal'] = 'cat'; $_SESSION['time'] = time(); //3個數據並不存儲在瀏覽器中,而是服務器上,但可以打印出來 echo '<pre>'; print_r($_SESSION); ?>
輸入如下圖所示,可以看到session ID對應的長串字符串:
<三>.session刪除
session的刪除需要三步,第一步刪除服務器端的session,第二步刪除實際的session,第三部刪除$_SESSION全局變量數組.代碼如下:
//第一步 刪除服務端session文件 session_destroy(); //第二步 刪除實際的session setcookie(session_name(),'',time()-3600); //第三步 刪除$_SESSION全局變量數組 $_SESSION = array();
<四>.session安全問題
攻擊者通過投入很大精力獲取用戶的會話ID,他們就可以在係統中擁有與此用戶相同的能力,因此校驗session ID的有效性是保護session安全.下麵一段代碼是我PHP項目時判斷數據庫MySQL中session用戶名和密碼的功能(作為自己以後的筆記):
<?php //啟動session session_start(); //輸入POST非空時賦值 if (!empty($_POST)) { $_SESSION['admin_name'] = $_POST['username']; $_SESSION['admin_pwd'] = $_POST['password']; } if($_SESSION['admin_name'] != 'admin' || $_SESSION['admin_pwd'] != 'admin') { header('Location:admin_home.php'); //跳轉回登錄頁麵 } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <!--在此處輸出,否則會出現亂碼或者先出現界麵--> <?php //輸出提示對話框 echo ("<script>alert('歡迎進入係統後台登陸界麵!')</script>"); ?> <title>圖書管理係統</title> </head> <script language="javascript"> function show() { window.alert("還沒有在後台係統添加該功能!\n前台已添加了刪除|更新|詳細信息功能。"); } </script> <h2> <!-- 網站的主體部分--> <body bgcolor="black" text="white"> .... </body> </h2> </html>
(該部分參考資料:《LAMPWAMP架構與開發》課件\博客https://blog.sina.com.cn/s/blog_6f49a3c30100p84k.html)
五. 總結
由於該“係統應用”係列文章都是采用C#語言完成,而該篇講述的PHP僅僅是對以前學習課程的鞏固,是對後麵的采用C#讀取Cookie和清除Cookie等曆史記錄的前提,所以題目命名是C#.同時確實文章寫得太晚,同時思路有些亂,本應該是幾篇文章的我一篇寫完了,所以請大家見諒!該文章主要來自《LAMPWAMP架構與開發》PPT課件,同時感謝我的CR老師和上麵文章的作者.
同時在VC中實現曆史記錄全麵清除-博主gisfarmer,詳細介紹了采用VC清除IE臨時文件\Cookies\瀏覽器地址欄曆史記錄地址\清除表單曆史記錄,對我的項目幫助很大.https://blog.csdn.net/gisfarmer/article/details/4327110
最後希望該文章對大家有所幫助,尊重作者的勞動果實,如果有錯誤或不足之處,請大家海涵!有點後悔當初學習PHP和數字圖像處理時沒多寫幾篇係列文章.
(By:Eastmount 2014-1-26 夜4點 https://blog.csdn.net/eastmount)
最後更新:2017-04-03 12:54:48