PHPLIB還可以做很多別的事情,例如數據庫類。本篇文章只是對PHPLIB的簡單介紹。有很多類和功能都沒有提到。你可以到http://phplib.netuse.de去獲取更多的幫助文檔
測試環境:標准環境
首先要說明一個事實,用Web頁面設計需要保存客戶當前狀態的程序時極為不便,例如在線Shopping,作為一名程序員,你必須時時面對在各個主頁之間傳遞的狀態參數。客戶的身份認證、他已做出的選擇、他當前的狀態等等,Web主頁並不會替你保存這些狀態信息,你必須自己小心處理這些參數,這給我們帶來了太多的不便,利用 http://url?var1=x1&var2=x2 來在主頁間傳送參數實在太危險,尤其是變量中包含用戶注冊信息時很輕易被sniff,那麼,我們如何解決這個問題呢?
PHPLIB解決了這個問題,它是在PHP3上的一個擴展,提供了很多類庫,使得程序員能很輕易地建立一個交互式Web站點,PHPLIB最基本的功能包括用戶認證,Session治理,權限及數據庫的抽象化。
安裝PHPLIB前你必須在你的服務器上先安裝好php3,PHPLIB可以運行在Cgi方式或apache附加模塊方式。PHP3的版本必須時在3.0.5之上,PHP3早期版本可以在編譯時使用參數 --enable-foce-cgi-redirect來獲得支持,假如不這麼做的話,會出現安全問題。PHP3的配置中 track_vars 需要設置為 enabled。同時需要一個數據庫,PHPLIB支持MySQL、Oracle、ODBC、PostgreSQL、Sybase。
第一步,PHPLIB的類庫需要根據系統進行初始化,你可以修改local.inc文件,其中包含著一些基本參數,你可以根據自己機器的情況來進行修改。
我們說明一下PHPLIB的工作原理,每一個使用PHPLIB的頁面首先必須可以找到運行PHPLIB的必須類庫文件,我們可以在php3.ini中設置auto_prepend變量來支持,PHPLIB分發包中包含一個prepend.php3文件,將auto_prepend指定為prepend.php3後,各頁面就會自動包含PHPLIB類庫,我們還可以將PHPLIB類庫所在目錄加進include變量中,以便可以找到這些文件,當然,最苯的辦法就是指定絕對路徑,這可不是個好主意!
第二步,每一個使用PHPLIB的頁面中,你必須使用函數page_open進行初始化。這會告訴PHPLIB,你現在或將來會用到狀態保存。一個典型的page_open例子包含到了認證、Session、權限:
<?php
page_open(array( "sess" => "Cms_Session", "auth" => "Cms_Auth", "perm" => "Cms_Perm"));
?>
數組變量(sess,auth,perm)用來初始化一些狀態保存對象,注重:必須使用PHPLIB內置名(sess,auth,perm),這些內置名是你在local.ini中所定義的,page_open函數必須在頁面內容輸出到浏覽器之前被調用。(假如你將來不會用到認證的話,可以不初始化sess),php3腳本最後應以page_close()結束,這將會將有關狀態數據寫回到數據庫中,假如你忘了的話,將會,哈哈哈。。。
因為PHPLIB使用了Cookies來保存狀態信息,所以page_open()函數必須在頁面內容輸出到浏覽器之前被調用, 這裡的頁面內容可以是任何HTML信息或者空行,假如你發現了錯誤"Oops - SetCookie called after header has been sent",這表明在page_open()之前向浏覽器輸出了些什麼,你要非凡留意空行,因為非常難找到,典型的錯誤是在< ? 和 ?>標記之間輸出了空行,你應檢查在local.inc和prepend.php3文件中是否包含了空行,這也是一個非常輕易出錯的地方。
PHP使用了一種比基本認證方法更為復雜的架構,這使得安全有了更好的保證。
舉例來說,對於你想要限制訪問的頁面,會首先使用page_open來調用"auth" => "auth_class" ,初始化認證狀態對象後,狀態就會被保存起來,隨後當客戶再訪問別的頁面的時候,認證系統就會首先檢測用戶的身份是否已經經過認證。
讓我們解釋一下,當一個用戶第一次訪問頁面時,他的身份未經過認證,PHPLIB會調用一個注冊窗口(並非在WINDOWS中的彈出窗口),你可以自己設計注冊窗口的樣式,當用戶輸入他的用戶名與口令,並按下提交鈕後,身份認證工作就開始了,隨後的情況有些復雜,讓我們慢慢解釋……
這裡分兩種情況,假如用戶的浏覽器不能兼容JavaScript的話,認證工作就象詢問嫌疑犯一樣,用戶名與口令被送往服務器,與存放在那裡的數據進行比較。假如用戶的浏覽器與JavaScript兼容,這就麻煩一些了,PHPLIB首先會在客戶端的頁面中放入一個用來加密的種子字串,名叫“challenge”,當用戶提交該頁面時,用戶的用戶名、口令和challenge字串會使用md5的加密方式進行加密,生成一個加密字串,將該加密字串與用戶名提交給服務器。當服務器收到用戶名和加密後的字串後,他根據數據庫中的用戶名與口令和得到的種子進行md5運算,將生成的字串與用戶提交的字串進行比較,假如符合的話,說明用戶身份是正確的,就答應用戶進行隨後的訪問。這種方法的好處是:用戶不用提交密碼,這使得認證比較安全。
Session 治理
其實Session的治理和身份認證非常接近,當一個用戶的身份認證過了後,隨即用戶的session就開始了,假如用戶的浏覽器支持cookie的話,將會建立一個session的id放入cookie,這個唯一的ID是由PHP3隨機生成,然後又用隨機種子
字串進行md5加密過了的,這裡的cookie應該叫做session cookie,因為這個cookie是不會寫到用戶硬盤裡去的,當一個session進行完的時候,該cookie也被完結了。假如用戶浏覽器不支持cookie的話,那麼 該session的id將會放入url鏈中,因為是加密過的,所以竊取了也沒用。session id存放著用戶的有關信息,如用戶已認證、認證到期時間、用戶權限,和其他一些你可能需要的信息,方便我們取用。
Session其實就是用戶一次會話的過程。Session的治理並不是僅僅用來跟蹤用戶的注冊,實際上,它還可以脫離認證來使用,你可以用它來存儲任何你想要存貯的信息,這些信息可以在用戶隨後訪問的頁面中派上用場,當然前提是那些頁面要使用PHPLIB。方法很簡單,注冊一個變量後即可在隨後的頁面中使用它,直至session結束。方法:
<?php $sess->register( "variable_name"); ?>
注重,這裡的variable_name不是變量值,而是變量名,可以先指定變量名,隨後再賦值。你在某個頁面中可以改變變量的值,隨後的頁面訪問該變量時會得到改變後的值。變量的類型是多樣的,可以是一個字串,一個數字,一個數組,甚至一個對象。舉例來說明:
<?php
$sess->register( "first");
if (check($firstname)) {
$first = $firstname;