閱讀596 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Hadoop源碼學習
  下一篇:go android屏蔽返回鍵,home鍵以及其他實體按鍵