|
在PHP開發(fā)中對比起Cookie,Session 是存儲在服務器端的會話,相對安全,并且不像 Cookie 那樣有存儲長度限制,本文簡單介紹 Session 的使用。 由于 Session 是以文本文件形式存儲在服務器端的,所以不怕客戶端修改 Session 內容。實際上在服務器端的 Session 文件,PHP 自動 修改 Session 文件的權限,只保留了系統(tǒng)讀和寫權限,而且不能通過 ftp 修改,所以安全得多。PHPChina 開源社區(qū)門戶k%W%e2CY 對于 Cookie 來說,假設我們要驗證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密后字符串),并在每次請 求頁面的時候進行驗證。如果用戶名和密碼存儲在數(shù)據(jù)庫,每次都要執(zhí)行一次數(shù)據(jù)庫查詢,給數(shù)據(jù)庫造成多余的負擔。因為我們并不能 只做一 次驗證。為什么呢?因為客戶端 Cookie 中的信息是有可能被修改的。假如你存儲 $admin 變量來表示用戶是否登陸,$admin 為 true 的時候 表示登陸,為 false 的時候表示未登錄,在第一次通過驗證后將 $admin 等于 true 存儲在 Cookie,下次就不用驗證了,這樣對么?錯了, 假如有人偽造一個值為 true 的 $admin 變量那不是就立即取的了管理權限么?非常的不安全。 而 Session 就不同了,Session 是存儲在服務器端的,遠程用戶沒辦法修改 Session 文件的內容,因此我們可以單純存儲一個 $admin 變量來判斷是否登陸,首次驗證通過后設置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉入登陸界面,這樣就可以減少很多 數(shù)據(jù)庫操作了。而且可以減少每次為了驗證 Cookie 而傳遞密碼的不安全性了(Session 驗證只需要傳遞一次,假如你沒有使用 SSL 安全協(xié)議 的話)。即使密碼進行了 md5 加密,也是很容易被截獲的。 當然使用 Session 還有很多優(yōu)點,比如控制容易,可以按照用戶自定義存儲等(存儲于數(shù)據(jù)庫)。我這里就不多說了。 Session 在 php.ini 是否需要設置呢?一般不需要的,因為并不是每個人都有修改 php.ini 的權限,默認 Session 的存放路徑是服務器 的系統(tǒng)臨時文件夾,我們可以自定義存放在自己的文件夾里,這個稍后我會介紹。 開始介紹如何創(chuàng)建 Session。非常簡單,真的。 啟動 Session 會話,并創(chuàng)建一個 $admin 變量: <?php 如果你使用了 Seesion,或者該 PHP 文件要調用 Session 變量,那么就必須在調用 Session 之前啟動它,使用 session_start() 函數(shù) 。其它都不需要你設置了a00-206 ,PHP 自動完成 Session 文件的創(chuàng)建。 執(zhí)行完這個程序后,我們可以到系統(tǒng)臨時文件夾找到這個 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec, 后面是 32 位編碼后的隨機字符串。用編輯器打開它,看一下它的內容: admin|N; 一般該內容是這樣的結構: 變量名|類型:長度:值; 并用分號隔開每個變量。有些是可以省略的,比如長度和類型。 我們來看一下驗證程序,假設數(shù)據(jù)庫存儲的是用戶名和 md5 加密后的密碼: <?php // 表單提交后... $query = "SELECT `username` FROM `user` WHERE `password` = '$password'"; if (!empty($userInfo)) 我們在需要用戶驗證的頁面啟動 Session,判斷是否登陸: <?php // 啟動會話,這步必不可少 // 判斷是否登陸 > 是不是很簡單呢?將 $_SESSION 看成是存儲在服務器端的數(shù)組即可,我們注冊的每一個變量都是數(shù)組的鍵,跟使用數(shù)組沒有什么分別。 如果要登出系統(tǒng)怎么辦?銷毀 Session 即可。 <?php session_start(); Session 能否像 Cookie 那樣設置生存周期呢?有了 Session 是否就完全拋棄 Cookie 呢?我想說,結合 Cookie 來使用 Session e20-040 9A0-041 才是 最方便的。 Session 是如何來判斷客戶端用戶的呢?它是通過 Session ID 來判斷的,什么是 Session ID,就是那個 Session 文件的文件名, Session ID 是隨機生成的,因此能保證唯一性和隨機性,確保 Session 的安全。一般如果沒有設置 Session 的生存周期,則 Session ID 存 儲在內存中,關閉瀏覽器后該 ID 自動注銷,重新請求該頁面后 ICDL-IT ,重新注冊一個 Session ID。 如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲 Session ID 和 Session 生存期的角色。 我們來手動設置 Session 的生存期: <?php 其實 Session 還提供了一個函數(shù) session_set_cookie_params(); 來設置 Session 的生存期的,該函數(shù)必須在 session_start() 函數(shù)調 用之前調用: <?php // 保存一天 如果客戶端使用 IE 6.0 , session_set_cookie_params(); 函數(shù)設置 Cookie 會有些問題,所以我們還是手動調用 setcookie 函數(shù)來創(chuàng) 建 cookie。 假設客戶端禁用 Cookie 怎么辦?沒辦法,所有生存周期都是瀏覽器進程了,只要關閉瀏覽器,再次請求頁面又得重新注冊 Session。那 么怎么傳遞 Session ID 呢?通過 URL 或者通過隱藏表單來傳遞,PHP 會自動將 Session ID 發(fā)送到 URL 上,URL 形如: 其中 URL 中的參數(shù) PHPSESSID 就是 Session ID了,我 們可以使用 $_GET 來獲取該值,從而實現(xiàn) Session ID 頁面間傳遞。 <?php // 保存一天 session_set_cookie_params($lifeTime); 對于虛擬主機來說,如果所有用戶的 Session 都保存在系統(tǒng)臨時文件夾里,將給維護造成困難,而且降低了安全性,我們可以手動設置 Session 文件的保存路徑,session_save_path()就提供了這樣一個功能。我們可以將 Session 存放目錄指向一個不能通過 Web 方式訪問的文 件夾,當然,該文件夾必須具備可讀寫屬性。 <?php 同 session_set_cookie_params(); 函數(shù)一樣,session_save_path() 函數(shù)也必須在 session_start() 函數(shù)調用之前調用。 我們還可以將數(shù)組,對象存儲在 Session 中。操作數(shù)組和操作一般變量沒有什么區(qū)別,而保存對象的話,PHP 會自動對對象進行序列化( 也叫串行化),然后保存于 Session 中。下面例子說明了這一點: <?php function setAge($age) { 當我們執(zhí)行 setage.php 文件的時候,調用了 setage() 方法,設置了年齡為 21,并將該狀態(tài)序列化后保存在 Session 中(PHP 將自動 完成這一轉換),當轉到 output.php 后,要輸出這個值,就必須反序列化剛才保存的對象,又因為在解序列化的時候需要實例化一個未定義 類,所以我們定義了以后回調函數(shù),自動包含 person.php 這個類文件,因此對象被重構,并取得當前 age 的值為 21,然后調用 output() 方法輸出該值。 |
|
|