PHPCookie與Session的使用與區別

技術小阿哥發表於2017-11-27

CookieSession

Cookie和session是目前使用的兩種儲存機制。cookie是從一個WEB頁到下一個WEB頁面的資料傳送方法,cookie儲存在客戶端;Session是讓資料在頁面中持續有效的一個傳遞方法,session儲存在伺服器端。

掌握了cookie與session這兩個技術,在WEB網站頁面間資訊傳遞的安全性是非常必要的,也是必不可少的。只要session存在,cookie就儲存這該sessionid,並在每次網頁請求時將該sessionid傳給伺服器。

要理解session和cookie的工作機制,需要理解http的B/S工作模式。瀏覽器每次請求(get或post),都可以通過表單將引數傳遞到指定的網頁。

一、Cookie管理

1、Cookie

Cookie 是一種在遠端瀏覽器端儲存資料並以此跟蹤和識別使用者的機制。簡單的說,cookie是WEB伺服器暫時儲存在使用者硬碟上的一個文字檔案,並隨後被WEB瀏 覽器讀取。當使用者在次訪問WEB網站時,網站通過讀取cookie檔案記錄這位訪客的特定資訊(如上次訪問的位置、花費的時間、使用者名稱和密碼等)從而迅速 做出響應,如在頁面中不需要輸入使用者名稱和密碼等,就可以直接登入網站等。文字檔案的命令格式如下:

使用者名稱@網站地址[數字].txt

開啟”我的電腦”—C盤(系統盤)—documentsand settings—administrator—cookie

這 個路徑就是cookie檔案儲存的路徑。Administrator是當前使用的使用者名稱,也就是登入本機的使用者 名,administrator@sogou[1].txt是指定格式自動生成的cookie檔案,index.dat是用來保儲所有開啟的WEB網站的 資訊,該檔案會隨著使用者開啟的網站隨時進行更新,在cookie資料夾下的每一個cookie檔案都是一個簡單而又普通的文字檔案,而不是程式。 Cookie中的內容大多是經過了加密處理的,因此表面看起來只是一些字母和數字的組合,這些內容只有伺服器才知道他們真正的含義。

Cookie常用於以下3個方面:

       記錄訪客的某些資訊。如可以利用cookie記錄使用者訪問網頁的次數,或者記錄訪客曾經輸入過的資訊,另外,某些網站可以應用cookie自動記錄訪客上次登入的使用者名稱。

       在頁面之間傳遞變數。瀏覽器並不會儲存當前頁面上任何變數資訊的,當頁面被關閉,頁面上的任何變數資訊將隨之消失。如果使用者宣告一個變數id=8,要把這 個變數傳遞到另一個頁面,可以把變數id以cookie形式儲存下來,然後在下一頁通過讀取該cookie來獲取變數的值。

       將所檢視的internet頁礁在cookie臨時資料夾中,這樣可以提高以後瀏覽的速度。

2、建立Cookie

在 PHP中通過setcookie函式建立Cookie。在建立之前必須瞭解的是,cookie是HTTP頭標的組成部分,而頭標必須在頁面其他內容之前發 送,它必須最先輸出,即使在setcookie()函式前輸出一個HTML標記或echo語句,甚至一個空行都會導致程式出錯。語法如下:

Bool setcookie(string name[,string value[,int expire [,stringpath [,string domain [,int secure]]]]])

該函式的引數說明如表:

    Name  cookie的變數名  可以通過$_cookie[“cookiename”]呼叫變數名cookiename的cookie

    Value  cookie的變理名  該值儲存在客戶端不能用來儲存敏感資料。可以通過$_cookie[“value”]獲取名為values的值

    Expire  cookie的失效時間,expire是標準的UNIX時間標記,可以用time()函式或mktime()函式獲取,單位為秒。

    Path    cookie在伺服器端的有效路徑  如果該引數設定為“/”,則它就在整個domain下的/11目錄及子目錄內有效。預設是當前目錄。

    Domain  cookie有效的域名  如果要使cookie在mrbccd.com域名下的所有子域都有效,應該設定為mrbccd.com

    Secure 指明cookie是否通過僅通過安全的https,值為0或1,如果值為1,則cookie只能在HTTPS連線上有效,如果值為預設值0,則cookie在HTTP和HTTPS連線上均有效。

例:

<?php

setcookie(“TMCcookie”,”www.baidu.com”);

setcookie(“TMCcookie”,”www.baidu.com”,time()+60);   //設定cookie有效時間為60秒

setcookie(“TMCcookie”,$value,time()+3600,”/cs/”,”baidu.com”,1);

?>

3、讀取Cookie

在PHP中可以直接通過超級全域性資料$_cookie[]來讀取瀏覽器端的cookie值。

例:

  <?php

if(!isset($_COOKIE[“visittime”])){    //檢測cookie檔案是否存在,如果不存在,往下執行

setcookie(“visittime”,date(“y-m-d H:i:s”));   //設定一個cookie變數

echo “歡迎第一次訪問網站。”;   

}else{

setcookie(“visittime”,date(“y-m-dH:i:s”),time()+60);   //如果存在,設定上帶cookie失效時間的變數。

echo “您上一次訪問的時間為:”.$_COOKIE[“visittime”];      

echo “<br>”;

}

echo “您本次訪問網站的時間為:”.date(“y-m-dH:i:s”);

?>

過60秒後我們重新整理,則顯示的是第一次訪問的時間。

    如果未設定cookie的到期時間,則在關閉瀏覽器時自動刪除cookie資料。如果為cookie設定了到期時間,瀏覽器將會記住cookie資料,即使使用者重新啟動計算機,只要沒有到期,再訪問網站時也會獲得資料資訊。

4、刪除Cookie

當cookie被建立後,如果沒有設定它的失效時間,其cookie檔案會在關閉瀏覽器時被自動刪除。如果想在關閉瀏覽器之前刪除cookie檔案,方法有兩種:一種是使用setcookie()函式刪除,另一種是使用瀏覽器手動刪除cookie。

1)、使用setcookie()函式刪除cookie

刪除cookie和建立cookie的方式基本類似,刪除cookie也使用setcookie()函式。刪除cookie只需要將setcookie()函式中第二個引數設定為空值,將第三個引數cookie的過期時間設定為小於系統的當前時間即可。

例如:將cookie的過期時間設定為當前時間減1秒,程式碼如下:

            setcookie(“name”,””,time()-1);

time()函式返回以秒錶示的當前時間戳,把過期時間減1秒就會得到過去的時間,從而刪除cookie.    注意:把過期時間設定為0,可以直接刪除cookie.

2)、使用瀏覽器手動刪除cookie

在使用cookie時,cookie自動生成一個文字檔案儲存在IE瀏覽器的cookies臨時資料夾中。使用瀏覽器刪除cookie檔案是非常便捷的方法。

開啟一個頁面—–工具—–internet選項,在“常規”選項卡——刪除cookie按鈕,彈出“刪除temporaryinternet files資料夾中的所有cookies嗎?”—–單擊“確定”,即可成功刪除全部cookie檔案。

5、Cookie的生命週期

如果cookie不設定時間,就表示它的生命週期為瀏覽器會話的期間,只要關閉IE瀏覽器,cookie就會自動消失。這種cookie被稱為會話cookie,一般不儲存在硬碟上,而是儲存在記憶體中。

    如果設定了過期時間,那麼瀏覽器會把cookie儲存到硬碟中,再次開啟IE瀏覽器時會被依然有效,直到它的有效期超時。

雖然cookie可以長期儲存在客戶端瀏覽器中,但也不是一成不變的。因為瀏覽器允許最多儲存300個cookie檔案,而且每個cookie檔案支援最大容量為4KB,每個域名最多支援20個cookie,如果達到限制,瀏覽器會自動地隨機刪除cookies.

6、            Cookie的綜合應用

在進行網站開發時,都需要製作一個計數器來記錄網站的訪問量,以此來吸引更多的訪客關注網站。

例:

  <?php

if(!empty($_COOKIE[“counter”])){

$counter=$_COOKIE[“counter”]+1;

}

else{

$counter=1;

}

setcookie(“counter”,$counter,time()+2678400);

echo “您是第”.$counter.”位訪客。”;

?>

關閉瀏覽器時也不會停止記數,除非C:Documents and SettingsAdministratorLocalSettingsTemporary Internet Files將檔案進行刪除才可以。

計數器的實現方法有多種。

二、Session管理

對比cookie,會話檔案中儲存的資料是在PHP指令碼中以變數的形式建立的,建立的會話變數在生命週期(20分鐘)中可以被跨頁的請求所引用。另外,session是儲存在伺服器端的會話,相對安全,並且不像cookie那樣有儲存長度的限制。

1、瞭解session

Session被譯成中文為“會話”,其本義是指有始有終的一系列動作/訊息,如打電話。

在計算機專業術語中,session是指一個終端使用者與互動系統進行通訊的時間間隔,通常指從註冊進入系統到登出退出系統之間所經過的時間。因此,session實現上是一個特定的時間概念。

2、Session的功能

Session 在WEB技術中佔有非常重要的份量。由於網頁是一種無狀態的連線程式。因此無法得知使用者的瀏覽狀態。因此必須通過session記錄使用者的有關資訊,以供 使用者再次以此身份對WEB伺服器提供要求時作確認。例,在電子商務網站中,通過session記錄使用者登入的資訊,以及使用者所購買的商品,如果沒有 session,那麼使用者就會每進入一個頁面都登入一遍使用者名稱和密碼。

另外,session會話適用於儲存使用者的資訊量比較小的情況。如果使用者需要儲存的資訊量相對較少,並用對儲存內容不需要長期儲存,那麼使用session把資訊儲存到伺服器端比較適合。

3、建立會話

建立一個會話需要通過以下幾個步驟實現:

啟動會話——–註冊會話——-使用會話——-刪除會話

1)啟動會話

啟動會話的方式有兩種:一種是使用session_start()函式,另一種使用session_register()函式為會話登入一個變數來隱含地啟動會話。

通常,session_start()函式在頁面開始位置呼叫,然後會話變數被登入到資料$_session。

其語法格式為:

      Bool session_start(void);

使用session_start()函式之前瀏覽器不能有任何輸出,否則會產生類似以下的錯誤提示。

    如果想使用session_satrt()這個全域性變數來儲存你的資料的話得在php.ini檔案中配置你的資訊:

       session.save_path = “D:/program files/php/temp”

    <?php

echo “呵呵……”;

session_start();

?>

執行結果如下

呵呵……
Warning: session_start()[function.session-start]:Cannot send session cache limiter – headers already sent (output started atC:webserverwwwroot11.php:1) in C:webserverwwwroot11.php on line 3

<?php

session_start();

?>

注意:該程式碼前不要有任何的程式碼,如果新建的檔案預設有的內容,要刪除。

Session_register()函式用來為會話登入一個變數來隱含地啟動會話,但要求設定php.ini檔案的選項,將register_globals指令設定為ON,然後重新啟動apache伺服器。

     使用session_register()函式時,不需要呼叫session_start()函式,PHP會在註冊變數之後隱含地呼叫session_start()函式。

2)註冊會話

會話變數被啟動後,全部儲存在陣列$_session中。通過陣列$_session建立一個會話變數很容易,只要直接給該陣列新增一個元素即可。

例:

<?php

session_start();

$_SESSION[“admin”]=null;

?>

3)使用會話

首先需要判斷會話變數是否有一個會話ID存在,如果不存在,就建立一個,並且使用其能夠通過全域性陣列$_SESSION進行訪問。如果已經存在,則將這個已註冊的會話變數載入以供使用者使用。

例:

   <?php

session_start();

$_SESSION[“admin”]=id;

if(!empty($_SESSION[“admin”])){

  $myvalue=$_SESSION[“admin”];

   echo $myvalue;

}else{

echo “該會話不存在。”;

}

?>

4)刪除會話

刪除會話的方法主要有刪除單個會話、刪除多個會話和結束當前會話的3種。

a) 刪除單個會話

刪除會話變數,同陣列的操作一樣,直接登出$_SESSION陣列的某個元素即可。

例如:登出$_SESSION[“admin”]變數,可以使用unset()函式,程式碼如下:

    unset($_SESSION[“admin”]);

b) 刪除多個會話

如果想要一次登出所有的會話變數,可以將一個空的陣列賦值給$_SESSION,程式碼如下:

      $_SESSION=array();

c)結束當前的會話

如果整個會話已經結束,首先應該登出所有的會話變數,然後使用session_destroy()函式清除結束當前的會話,並清空會話中的所有資源,徹底銷燬session,程式碼如下:

    session_destroy();

4、Session的綜合應用—-通過session判斷使用者的操作許可權

大多數網站的開發過程中,需要對管理員和普通使用者對操作網站的許可權進行劃分。

例:13.php

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN””http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″ />

<title>用session判斷使用者操作許可權</title>

<script type=”text/javascript”language=”javascript”>

function check(){  

if(form1.user.value==””){

    alert(“請輸入使用者名稱,謝謝!”);

       form1.user.focus();

       return false;

}

if(form1.pwd.value==””){

   alert(“請輸入密碼,謝謝!”);

   form1.pwd.focus();

   return false;

}

form1.submit();

}

</script>

</head>

<body>

<form name=”form1″ method=”post”action=”check_13.php”>

使用者名稱:<input type=”text”name=”user” size=”20″ /><br /><br />

密&nbsp;&nbsp;碼:<inputtype=”password” name=”pwd” size=”21″ /><br/><br />

<input type=”submit” name=”submit”value=”提交” onclick=”check()”/>

<input type=”reset” name=”reset”value=”重置” />

</form>

</body>

</html>

check_13.php

<?php

session_start();

$_SESSION[user]=$_POST[user];

$_SESSION[pwd]=$_POST[pwd];

?>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN””http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<meta http-equiv=”Content-Type”content=”text/html; charset=gb2312″ />

<title>check_13.php</title>

</head>

<body>

<?php

if($_SESSION[user]==””){

echo”<script> alert(`請選擇正確的登入途徑!`);history.back();</script>”;

}

if($_SESSION[user]==”123″ &&$_SESSION[pwd]==”123″){

   echo “您是管理員使用者<br>”;

   echo “<ahref=`admin.php`>請進入管理員使用者管理頁面。</a>”;

}else{

  echo “您是普通使用者”;

  echo “<ahref=`user.php`>請進入普通使用者管理頁面。</a>”;

}

?>

<?php

session_start();

unset($_SESSION[user]);

unset($_SESSION[pwd]);

session_destroy();

?>

</body>

</html>

三、CookieSession的比較

它 們最大的區別是Session是將Session的資訊儲存在伺服器上,並通過一個Sessionid來傳遞客戶的資訊,同時伺服器接收到 Sessionid後,根據這個ID來提供相關的Session資源;cookie是將所有的資訊以文字檔案的形式儲存在客戶端,並由瀏覽器進行管理和維 護。

由於session為伺服器儲存,所以遠端使用者無法修改session檔案的內容。而cookie為客戶端儲存,所以session要比cookie安全得多。當然使用session還有很多優點,如控制容易,可以按照使用者自定義儲存(儲存於資料庫)。

更多PHP 學習資料

   盡在 愛思社群(http://bbs.aseoe.com/forum.phpmod=forumdisplay&fid=41&filter=typeid&typeid=17 )




cookie工作機理:

a) 伺服器通過隨著響應傳送一個http的Set-Cookie頭,在客戶機中設定一個cookie(多個cookie要多個頭).

b) 客戶端自動向伺服器端傳送一個http的cookie頭,伺服器接收讀取.

HTTP/1.x 200 OK

X-Powered-By: PHP/5.2.1

Set-Cookie: TestCookie=something from somewhere; path=/

Expires: Thu, 19 Nov 2007 18:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Content-type: text/html

這一行實現了cookie功能,收到這行後

Set-Cookie: TestCookie=something from somewhere; path=/

瀏覽器將在客戶端的磁碟上建立一個cookie檔案,並在裡面寫入:

TestCookie=something from somewhere;

/

這一行就是我們用setcookie(`TestCookie`,`something from somewhere`,`/`);的結果.也就是用header(`Set-Cookie: TestCookie=something from somewhere; path=/`);的結果.


會話

訪問網站的來客會被分配一個唯一的識別符號,即所謂的會話 ID。它要麼存放在客戶端的 cookie,要麼經由 URL 傳遞。 

會 話支援允許使用者註冊任意數目的變數並保留給各個請求使用。當來客訪問網站時,PHP 會自動(如果 session.auto_start 被設為 1)或在使用者請求時(由 session_start() 明確呼叫或 session_register() 暗中呼叫)檢查請求中是否傳送了特定的會話ID。如果是,則之前儲存的環境就被重建。


 sessionID的傳送

1 通過cookie傳送sessin ID

     使用session_start()呼叫session,伺服器端在生成session檔案的同時,生成session ID雜湊值和預設值為PHPSESSID的session name,並向客戶端傳送變數為(預設的是)PHPSESSID(session name),值為一個128位的雜湊值.伺服器端將通過該cookie與客戶端進行互動.

   session變數的值經php內部系列化後儲存在伺服器機器上的文字檔案中,和客戶端的變數名預設情況下為PHPSESSID的coolie進行對應互動.

     即伺服器自動傳送了http頭:header(`Set-Cookie: session_name()=session_id(); path=/`);

即setcookie(session_name(),session_id());

    當從該頁跳轉到的新頁面並呼叫session_start()後,PHP將檢查與給定ID相關聯的伺服器端存貯的session資料,如果沒找到,則新建一個資料集.

2 通過URL傳送session ID

只有在使用者禁止使用cookie的時候才用這種方法,因為瀏覽器cookie已經通用,為安全起見,可不用該方法.

<a href=”http://blog.163.com/wz_pk007/blog/p.php?<?php print session_name() ?>=<?php print session_id() ?>”>xxx</a>,也可以通過POST來傳遞session值.inttest

對於訪問量大的站點,用預設的session存貯方式並不適合,目前最優的方法是用資料庫存取session.

本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1737105,如需轉載請自行聯絡原作者


相關文章