用戶在設(shè)計和維護站點的時候,經(jīng)常需要限制對某些重要文件或信息的訪問。通常,我們可以采用內(nèi)置于web于http協(xié)議的用戶身份驗證機制。當(dāng)訪問者瀏覽受保護頁面時,客戶端瀏覽器會彈出對話窗口要求用戶輸入用戶名和密碼,對用戶的身份進行驗證,以決定用戶是否有權(quán)訪問頁面。下面用兩種方法來說明其實現(xiàn)原理。
一、用http標(biāo)頭來實現(xiàn)
標(biāo)頭是服務(wù)器以http協(xié)議傳送html信息到瀏覽器前所送出的字串。http采用一種挑戰(zhàn)/響應(yīng)模式對試圖進入受密碼保護區(qū)域的用戶進行身份驗證。具體來說,當(dāng)用戶首次向web器發(fā)出訪問受保護區(qū)域的請求時,挑戰(zhàn)進程被啟動,服務(wù)器返回特殊的401標(biāo)頭,表明該用戶身份未經(jīng)驗證??蛻舳藶g覽器在檢測到上述響應(yīng)之后自動彈出對話框,要求用戶輸入用戶名和密碼。用戶完成輸入之后點擊確定,其身份識別信息就被傳送到服務(wù)端進行驗證。如果用戶輸入的用戶名和密碼有效,web服務(wù)器將允許用戶進入受保護區(qū)域,并且在整個訪問過程中保持其身份的有效性。相反,若用戶輸入的用戶名稱或密碼無法通過驗證,客戶端瀏覽器會不斷彈出輸入窗口要求用戶再次嘗試輸入正確的信息。整個過程將一直持續(xù)到用戶輸入正確的信息位置,也可以設(shè)定允許用戶進行嘗試的最大次數(shù),超出時將自動拒絕用戶的訪問請求。
在php腳本中,使用函數(shù)header()直接給客戶端的瀏覽器發(fā)送http標(biāo)頭,這樣在客戶端將會自動彈出用戶名和密碼輸入窗口,來實現(xiàn)我們的身份認(rèn)證功能。在php中,客戶端用戶輸入的信息傳送到服務(wù)器之后自動保存在 $php_auth_user,$php_auth_pw,以及 $php_auth_type這三個全局變量中。利用這三個變量,我們可以根據(jù)保存在數(shù)據(jù)文件或者數(shù)據(jù)庫中用戶帳號信息來驗證用戶身份!
不過,需要提醒使用者注意的是:只有在以模塊方式安裝的php中才能使用$php_auth_user,$php_auth_pw,以及 $php_auth_type這三個變量。如果用戶使用的是cgi模式的php則無法實現(xiàn)驗證功能。在本節(jié)后附有php的模塊方式安裝方法。
下面我們用mysql數(shù)據(jù)庫來存儲用戶的身份。我們需要從數(shù)據(jù)庫中提取每個帳號的用戶名和密碼以便與$php_auth_user和$php_auth_pw變量進行比較,判斷用戶的真實性。
首先,在mysql中建立一個存放用戶信息的數(shù)據(jù)庫
數(shù)據(jù)庫名為xinxiku ,表名為user;表定義如下:
以下為引用的內(nèi)容: create table user( id int(4) not null auto_increment, name varchar(8) not null, password char(8) not null, primary key(id) ) |
說明:
1、id為一個序列號,不為零而且自動遞增,為主鍵;
2、name為用戶名,不能為空;
3、password為用戶密碼,不能為空;
以下是用戶驗證文件login.php
以下為引用的內(nèi)容: ﹤?php//判斷用戶名是否設(shè)置 if(!isset($php_auth_user)) { header("www-authenticate:basic realm="身份驗證功能""); header("http/1.0 401 unauthorized"); echo "身份驗證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!"; exit(); } /*連接數(shù)據(jù)庫*/ $db=mysql_connect("localhost","root",""); //選擇數(shù)據(jù)庫 mysql_select_db("xinxiku",$db); //查詢用戶是否存在 $result=mysql_query("select * from user where name='$php_auth_user' and password='$php_auth_pw'",$db); if ($myrow = mysql_fetch_row($result)) { //以下為身份驗證成功后的相關(guān)操作 } else { //身份驗證不成功,提示用戶重新輸入 header("www-authenticate:basic realm="身份驗證功能""); header("http/1.0 401 unauthorized"); echo "身份驗證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!"; exit(); } ?> |
程序說明:
在程序中,首先檢查變量$php_auth_user是否已經(jīng)設(shè)置。如果沒有設(shè)置,說明需要驗證,腳本發(fā)出http 401錯誤號頭標(biāo),告訴客戶端的瀏覽器需要進行身份驗證,由客戶端的瀏覽器彈出一個身份驗證窗口,提示用戶輸入用戶名和密碼,輸入完成后,連接數(shù)據(jù)庫,查詢該用用戶名及密碼是否正確,如果正確,允許登錄進行相關(guān)操作,如果不正確,繼續(xù)要求用戶輸入用戶名和密碼。
函數(shù)說明:
1、isset():用于確定某個變量是否已被賦值。根據(jù)變量值是否存在,返回true或false
2、header():用于發(fā)送特定的http標(biāo)頭。注意,使用header()函數(shù)時,一定要在任何產(chǎn)生實際輸出的html或php代碼前面調(diào)用該函數(shù)。
3、mysql_connect():打開 mysql 服務(wù)器連接。
4、mysql_db_query():送查詢字符串 (query) 到 mysql 數(shù)據(jù)庫。
5、mysql_fetch_row():返回單列的各字段。
二、用session實現(xiàn)服務(wù)器驗證
對于需要身份驗證的頁面,使用apache服務(wù)器驗證是最好不過的了。但是,apache服務(wù)器驗證的界面不夠友好。而且,cgi模式的php,iis下的php,都不能使用apache服務(wù)器驗證。這樣,我們可以利用session在不同頁面間保存用戶身份,達到身份驗證的目的。
在后端我們同樣利用上面的mysql數(shù)據(jù)庫存放用戶信息。
我們先編寫一個用戶登錄界面,文件名為login.php,代碼如下:
以下為引用的內(nèi)容: ﹤form action="login1.php"﹥ 用戶名:﹤input type="text" name="name"﹥﹤br﹥ 口 令:﹤input type="text" name="pass"﹥﹤br﹥ ﹤input type="submit" value="登錄"﹥ ﹤/form﹥ ﹤?php $db=mysql_connect("localhost","root",""); mysql_select_db("xinxiku",$db); $result=mysql_query("select * from user where name='$name' and password='$pass'",$db); if ($myrow = mysql_fetch_row($result)) { //注冊用戶 session_start(); session_register("user"); $user=$myrow["user"]; // 身份驗證成功,進行相關(guān)操作 ... } else { echo"身份驗證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!"; } ?﹥ 這里需要說明的是,用戶可以使用在后續(xù)的操作中用**http://domainname/next.php?user=用戶名 **來繞過身份驗證。所以,后續(xù)的操作應(yīng)先檢查變量是否注冊:已注冊,則進行相應(yīng)操作,否則視為非法登錄。相關(guān)代碼如下: ﹤?php session_start(); if (!session_is_registered("user")){ echo "身份驗證失敗,屬于非法登錄!"; } else { //成功登錄進行相關(guān)操作 } ?﹥ |
附錄:php以模塊方式安裝方法
1、首先下載文件:mod_php4-4.0.1-pl2。[如果你的不是php4,那么就趕快升級吧!]
解開后有三個文件:mod_php4.dll、mod_php4.conf、readme.txt
2、相關(guān)文件拷貝
把mod_php4.dll拷貝到apache安裝目錄的modules目錄下面
把mod_php4.conf拷貝到apache安裝目錄的conf目錄下面
把msvcrt.dll文件拷貝到apache的安裝目錄下面
3、打開conf/srm.conf文件 ,在其中加上一句
include conf/mod_php4.conf
在做這一些之前請把您的httpd.conf中關(guān)于cgi模式的所以設(shè)置語句都去掉,即類似下面的部分!
以下為引用的內(nèi)容: scripalias/php4/ "c:/php4/" addtype application/x-httpd-php4.php addtype application/x-httpd-php4.php3 addtype application/x-httpd-php4.php4 action application/x-httpd-php4/php4/php.exe |
要想使php支持更多的后綴名,沒問題。在給出的配置文件mod_php4.conf已經(jīng)支持了三種后綴名php,php3,php4,如果你還想支持更多的后綴名可以更改這個文件,很簡單的。
4、測試
用﹤? phpinfo();?﹥ 測試。會看到server api的值為apache,而不是cgi ,而且還有有關(guān)http headers information的信息。
新聞熱點
疑難解答