php职业认证,如何用 PHP 进行 HTTP 认证
PHP 的 HTTP 認證機制在 PHP 以 Apache 模塊方式運行時才有效,因此該功能不適用于 CGI 版本。在 Apache 模塊的 PHP 腳本中,可以用 header() 函數來向客戶端瀏覽器發送“Authentication Required”信息,使其彈出一個用戶名/密碼輸入窗口。當用戶輸入用戶名和密碼后,包含有 URL 的 PHP 腳本將會再次和預定義變量 PHP_AUTH_USER、PHP_AUTH_PW 和 AUTH_TYPE 一起被調用,這三個變量分別被設定為用戶名,密碼和認證類型。預定義變量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 數組中。系統支持“基本的”認證。請參閱 header() 函數以獲取更多信息。
PHP 版本問題: Autoglobals 局變量,包括 $_SERVER等,在 PHP 4.1.0 以后版本有效, $HTTP_SERVER_VARS 從 PHP 3 開始有效。
以下是在頁面上強迫客戶端認證的腳本范例:
例子 16-1. HTTP 認證范例
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "
Hello {$_SERVER['PHP_AUTH_USER']}.
";
echo "
You entered {$_SERVER['PHP_AUTH_PW']} as your password.
";
}
?>
兼容性問題: 在編寫 HTTP 頭信息代碼時請格外小心。為了對所有的客戶端保證兼容性,關鍵字“Basic”的個字母必須大寫為“B”,分界字符串必須用雙引號(不是單引號)引用;并且在頭信息行 HTTP/1.0 401 中,在 401 前必須有且有一個空格。
在以上例程中,我們只打印出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在實際運用中,您可能需要對用戶名和密碼的合法性進行檢查。或許進行數據庫的查詢,或許從 dbm 文件中檢索。
請注意由 Internet Explorer 瀏覽器本身的問題帶來的錯誤。它對頭信息的順序顯得似乎有點吹毛求疵。目前在 HTTP/1.0 401 頭之前發送 WWW-Authenticate 頭信息能解決該問題。
在 PHP 4.3.0 中,為了防止有人通過編寫腳本來從用傳統外部機制認證的頁面上獲取密碼,當外部認證對特定頁面有效,并且 安模式 被開啟時,PHP_AUTH 變量將不會被設置。但無論如何,REMOTE_USER 可以被用來辨認外部認證的用戶,即使用 $_SERVER['REMOTE_USER'] 變量。
設置問題: PHP 用 AuthType 選項來判斷外部認證機制是否有效。
注意,這仍然不能防止有人通過未認證的 URL 來從同一服務器上認證的 URL 上偷取密碼。
Netscape Navigator 和 Internet Explorer 瀏覽器都會在收到 401 的服務端返回信息時清空所有的本地瀏覽器整個域的 Windows 認證緩存。這能夠有效的注銷一個用戶,并迫使他們重新輸入他們的用戶名和密碼。有些人用這種方法來使登錄狀態“過期”,或者作為“注銷”按鈕的響應行為。
例子 16-2. 強迫重新輸入用戶名和密碼的 HTTP 認證的范例
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
}
else {
echo "
Welcome: {$_SERVER['PHP_AUTH_USER']}
";
echo "Old: {$_REQUEST['OldAuth']}";
echo "
\n";
echo "\n";
echo "\n";
echo "\n";
echo "
\n";
}
?>
該行為對于 HTTP 基本認證標準來說并不是必須的,因此您不能依靠這種方法。對 Lynx 瀏覽器的測試表明 Lynx 在收到 401 的服務端返回信息時不會清空認證文件,因此只要對認證文件的檢查要求沒有變化,只要用戶點擊“后退”按鈕,再點擊“前進”按鈕,其原有資源仍然能夠被訪問。不過,用戶可以通過按“_”鍵來清空他們的認證信息。
同時請注意,在 PHP 4.3.3 之前,由于微軟 IIS 的限制,HTTP 認證無法工作在 IIS 服務器的 CGI 模式下。為了能夠使其在 PHP 4.3.3 以上版本能夠工作,您需要編輯 IIS 的設置“目錄安”。點擊“編輯”并且只選擇“匿名訪問”,其它所有的復選框都應該留空。
另一個限制,在您使用 IIS 的 ISAPI 模式的時候,您無法使用 PHP_AUTH_* 變量,而只能使用 HTTP_AUTHORIZATION。例如,考慮如下代碼:list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));。
總結
以上是生活随笔為你收集整理的php职业认证,如何用 PHP 进行 HTTP 认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加盟内衣店多少钱啊?
- 下一篇: 注销公司登报多少钱啊?