在php中cookie與session的區別在於cookie數據保存在客戶端,session數據保存在服務器端了,自然在使用方法上會有些細節上的區別了,但後面比前者要安全得多。
1.cookie&session簡介和區別
cookie數據保存在客戶端,session數據保存在服務器端。
簡 單的說,當你登錄一個網站的時候,如果web服務器端使用的是session,那麼所有的數據都保存在服務器上面,客戶端每次請求服務器的時候會發送 當前會話的sessionid,服務器根據當前sessionid判斷相應的用戶數據標志,以確定用戶是否登錄,或具有某種權限。由於數據是存儲在服務器 上面,所以你不能偽造,但是如果你能夠獲取某個登錄用戶的sessionid,用特殊的浏覽器偽造該用戶的請求也是能夠成功的。sessionid是服務 器和客戶端鏈接時候隨機分配的,一般來說是不會有重復,但如果有大量的並發請求,也不是沒有重復的可能性,我曾經就遇到過一次。登錄某個網站,開始顯示的 是自己的信息,等一段時間超時了,一刷新,居然顯示了別人的信息。
如果浏覽器使用的是 cookie,那麼所有的數據都保存在浏覽器端,比如你登錄以後,服務器設置了 cookie用戶名(username),那麼,當你再次請求服務器的時候,浏覽器會將username一塊發送給服務器,這些變量有一定的特殊標記。服 務器會解釋為 cookie變量。所以只要不關閉浏覽器,那麼 cookie變量便一直是有效的,所以能夠保證長時間不掉線。如果你能夠截獲某個用戶的 cookie變量,然後偽造一個數據包發送過去,那麼服務器還是認為你是合法的。所以,使用 cookie被攻擊的可能性比較大。如果設置了的有效時間,那麼它會將 cookie保存在客戶端的硬盤上,下次再訪問該網站的時候,浏覽器先檢查有沒有 cookie,如果有的話,就讀取該 cookie,然後發送給服務器。如果你在機器上面保存了某個論壇 cookie,有效期是一年,如果有人入侵你的機器,將你的 cookie拷走,然後放在他的浏覽器的目錄下面,那麼他登錄該網站的時候就是用你的的身份登錄的。所以 cookie是可以偽造的。當然,偽造的時候需要主意,直接copy cookie文件到 cookie目錄,浏覽器是不認的,他有一個index.dat文件,存儲了 cookie文件的建立時間,以及是否有修改,所以你必須先要有該網站的 cookie文件,並且要從保證時間上騙過浏覽器,曾經在學校的vbb論壇上面做過試驗,copy別人的 cookie登錄,冒用了別人的名義發帖子,完全沒有問題。
Session是由應用服務器維持的一個服務器端的存儲空間,用戶在連接服務器時,會由服務器生成一個唯一的SessionID,用該SessionID 為標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也會失效。
服務器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。
可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。
2.cookie的配置與應用
基本語法:setcookie("cookie", "cookievalue", time()+3600, "/forum", ".xxx.com", 1);
名字 值 有效時間,毫秒 路徑 保存域 是否使用https
訪問和處理cookie
訪問基本語法:
刪除cookie
刪除基本語法:
實例:
代碼如下 復制代碼<?php
if ($_POST['user'] && $_POST['password']) {
setcookie("us", $_POST['user']);
setcookie("pwd", $_POST['password']);
echo "用戶:".$_COOKIE['us']."<br />"."密碼:".$_COOKIE['pwd'];
}
?>
<form id="form1" name="form1" method="post" action="file.php">
用戶:<input type="text" name="user" />
<br />
密碼:<input type="text" name="password" />
<input type="submit" name="Submit" value="提交" />
</form>
注意:在輸出之前必須操作完cookie,否則error。
--------------------------------------------------------
1.session的配置與應用
基本語法:
代碼如下 復制代碼 session_start(); //初始化,必須放在文件頭。舉一些實例來介紹session與cookie上的區別
<一>:session
啟動session:
session_start();
PS:該函數需要放在文件最前端,前面不要有任何輸出,最好頂頭寫(不要有前導空格).
設置session:
$_SESSION['name']='value';
PS:在使用的時候,直接使用$_SESSION[]方法設置值,其中"[ ]"部分為session的name,"="後面為值.
讀取session:
echo $_SESSION['name'];
PS:不論是設置session還是讀取session都要先開啟session(使用session_start()).
銷毀session:
1.關閉浏覽器,自動銷毀.
2.直接給 $_SESSION[]=''; 清空.
<二>:cookie
設置cookie:
bool setcookie(string name[,string value[,int expire[,string path[,string domain[,bool secure[,bool httponly]]]]]] )
name: cookie變量名
value: cookie變量的值
expire: 有效期結束的時間,
path: 有效目錄,
domain: 有效域名,頂級域唯一
secure: 如果值為1,則cookie只能在https連接上有效,如果為默認值0,則http和https都可以.
例如:
setcookie('username','hello',time()+3600);
setcookie("username",'hello',time()+3600,"/~rasmus/",".paea.cn",1);
PS:setcookie前不能出現輸出數據操作,否則就會出現錯誤類似於session_start().
讀取cookie:
echo $_COOKIE['username'].'||';
echo $HTTP_COOKIE_VARS["username"];
PS:兩種輸出方式.
銷毀cookie:
設置一個過去的時間來注銷cookie
setcookie('username','hello',time()-3600);
PS:setcookie前不能出現輸出數據操作,否則就會出現錯誤類似於session_start().
總結一下
作用:
session和cookie都是用於暫時記錄用戶數據的方式.
區別:
1.SESSION存儲在服務器端,用戶無法進行修改,比較安全,COOKIE存儲在客戶端,用戶可以進行修改,不安全。
2.Session會在一定時間內保存在服務器上,會占用服務器資源。Cookie存儲在用戶windows下的Temp目錄中的。
3.單個cookie在客戶端的限制是4k
4.session遍歷使用$_SESSION[] ,cookie遍歷使用$_COOKIE[]
5.禁用過cookie後session無法使用
6.session使用的時候要加session_start()並且前面不能有任何輸出.