建設一個簡單互動的網站(三)
6. 密碼驗證
也許你想在自己的網站放上你的照片集,而且只想給自己知心的朋友看,這時你需要一個密碼驗證的程式。
6.1 基於HTTP驗證
如何用php來實現密碼驗證的功能呢?我們可以使用簡短的PHP代碼,使用函數header()發送HTTP標題強制驗證,用戶端瀏覽器則彈出供輸入使用者名稱和密碼的對話方塊。在PHP中,用戶端使用者輸入的資訊傳送到服務端之後自動儲存在$PHP_AUTH_USER, $PHP_AUTH_PW, 以及 $PHP_AUTH_TYPE這三個全域變數中。利用這些變數,我們就可以根據實現儲存在資料檔案或資料庫中的使用者帳號資訊驗證使用者身份。
不過在這裡需要提醒使用者注意的一點是:只有在Apache模組方式啟動並執行時候,PHP指令碼才能使用$PHP_AUTH_USER, $PHP_AUTH_PW, 以及 $PHP_AUTH_TYPE這三個變數。如果使用者使用的是CGI模式的PHP則無法實現基於HTTP的驗證功能。
6.2 下面,我們就來詳細介紹一下如何使用PHP對使用者身份進行驗證。
在下例中,我們是使用$PHP_AUTH_USER和$PHP_AUTH_PW這兩個變數來驗證進入者是否合法並允許進入。在本例中被允許登入的使用者名稱和密碼對分別為tnc和nature:
if(!isset($PHP_AUTH_USER))
{
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel buttonn";
exit;
}
else
{
if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") )
{
// 如果是錯誤的使用者名稱稱/密碼對,強制再驗證
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.";
exit;
}
else
{
echo "Welcome tnc!";
}
?>
事實上再實際引用中不大可能如上面使用程式碼片段明顯的使用者名稱稱/密碼對,而是利用資料庫或者加密的密碼檔案存取它們。
6.3 根據指定的驗證資訊核實使用者身份
首先,我們可以使用以下代碼確定使用者是否已經輸入了使用者名稱和密碼,並顯示出使用者輸入的資訊。
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="My PRivate Stuff"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
else {
echo "
You have entered this username: $PHP_AUTH_USER
You have entered this passWord: $PHP_AUTH_PW
The authorization type is: $PHP_AUTH_TYPE
";
}
?>
說明:
isset()函數用於確定某個變數是否已被賦值。根據變數值是否存在,返回true或false。
header()函數用於發送特定的HTTP標題。注意,使用header()函數時,一定要在任何產生實際輸出的HTML或PHP代碼前面調用該函數。
雖然上述代碼相當簡單,沒有根據任何實際值對使用者輸入的使用者名稱和密碼進行有效驗證,但是至少我們瞭解了如何使用PHP在用戶端產生輸入對話方塊。
下面,我們就來瞭解一下如何根據指定的驗證資訊核實使用者身份。代碼如下:
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
else if (isset($PHP_AUTH_USER)) {
if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "123")) {
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
} else {
echo "
You're authorized!
";
}
}
?>
在這裡,我們首先檢查使用者是否已經輸入了使用者名稱稱和密碼,如果沒有則彈出相應對話方塊要求使用者輸入身份資訊。隨後,我們通過判斷使用者輸入的資訊是否符合admin/123這一指定使用者帳號來授予使用者存取權限或提示使用者再次輸入正確的資訊。這種方法適用於所有使用者都使用同一登入帳號的網站。
6.4 另一種簡易的密碼驗證
如果你是在windows98下面編寫和運行著你的PHP指令碼,或者是你在linux下面按預設設定,將PHP安裝成一個CGI程式的話,你將無法使用上面的PHP程式來實現驗證功能。為此,無邊給大家提供了另外一種簡易的密碼驗證的方法。雖然實用性不大,但是拿來學習還是挺好的。
$password = "123";
// check password
if($pass != $password)
{
echo "管理密碼";
echo "";
}
else
{
echo "恭喜你,你已經通過了密碼驗證";
echo "";
}
?>