在PHP中,如果希望在每一段腳本上都進行口令保護,可以結(jié)合使用header()語句、$PHP_AUTH_USER和$PHP_AUTH_PW來建立基本的認證方案,一般情況下,基于服務(wù)器的提問和響應(yīng)順序如下:
1.用戶從服務(wù)器上請求一個文件,如果這個文件在服務(wù)器上是被保護的,則在響應(yīng)的頭部向用戶返回一個401(示用戶應(yīng)授權(quán))字符串;
2.瀏覽器收到這個響應(yīng)后,彈出要求用戶輸入用戶名/口令的對話框;
3.用戶在對話框中輸入一個用戶名和口令,點擊OK按鈕將信息返回服務(wù)器供認證使用;
4.如果用戶名和口令有效,被保護的文件將向用戶開放,只要用戶還在使用文件,認證會一直有效。
一段簡單的PHP腳本文件通過向用戶發(fā)送一個適當?shù)哪軌蛞鹱詣语@示用戶名/口令對話框的HTTP頭部就可以模仿HTTP的提問/響應(yīng)系統(tǒng),PHP把用戶在用戶名/口令對話框中輸入的信息存儲在$PHP_AUTH_USER和$PHP_AUTH_PW中,使用這二個變量,就可以與存儲在文本文件、數(shù)據(jù)庫等文件中的用戶名/口令進行比較。
這個例子中,筆者采用了兩個常量值進行認證,其實無論用戶名和口令是常量還是變量,其原理都是相同的。
〈?
/ 檢查$PHP_AUTH_USER和$PHP_AUTH_PW中的值/
if ((!isset($PHP_AUTH_USER)) (!isset($PHP_AUTH_PW))) {
/ 如果沒有值,則發(fā)送一個能夠引發(fā)對話框出現(xiàn)的頭部/
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
} else if ((isset($PHP_AUTH_USER)) &&&& (isset($PHP_AUTH_PW))){
/ 變量中有值,檢查它們是否正確/
if (($PHP_AUTH_USER != "validname") ($PHP_AUTH_PW != "goodpassword")) {
/ 如果輸入的用戶名和口令中有一個不正確,則發(fā)送一個能夠引發(fā)對話框出現(xiàn)的頭部 /
header('WWW-Authenticate: Basic realm="My Private Stuff"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
} else if (($PHP_AUTH_USER == "validname") ($PHP_AUTH_PW == "goodpassword")) {
/ 如果二個值都正確,顯示成功的信息 /
echo "〈P〉You're authorized!〈/p〉";
}
}
?〉
需要注意的是,如果你使用的是基于文件的保護機制,它并不能保證目錄中所有文件的安全。它可能保護大部分的文件,如果你認為它能夠保護給定目錄中的所有文件,你的這種認識就需要變變了。