PHP 的 HTTP 認証機制僅在 PHP 以 Apache 模塊方式執行時才有效,因此該功能不適用於 CGI 版本。在 Apache 模塊的 PHP 腳本中,可以用 header() 函式來向客戶端瀏覽器發送“Authentication Required”訊息,使其彈出一個用戶名/密碼輸入視窗。當用戶輸入用戶名和密碼後,包含有 URL 的 PHP 腳本將會再次和預定義變數 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 一起被呼叫,這三個變數分別被設定為用戶名,密碼和認証型別。預定義變數保存在 $_SERVER 或者 $HTTP_SERVER_VARS 陣列中。系統僅支援“基本的”認証。請參閱 header() 函式以獲取更多訊息。
PHP 版本問題: Autoglobals 全域變數,包括 $_SERVER等,在 PHP 4.1.0 以後版本有效, $HTTP_SERVER_VARS 從 PHP 3 開始有效。
以下是在頁面上強迫客戶端認証的腳本範例:
相容性問題: 在編寫 HTTP 表頭訊息代碼時請格外小心。為了對所有的客戶端保証相容性,關鍵字“Basic”的第一個字母必須大寫為“B”,分界字串必須用雙引號(不是單引號)引用;並且在表頭訊息行 HTTP/1.0 401 中,在 401 前必須有且僅有一個空格。
在以上例程中,我們僅僅只顯示出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在實際運用中,您可能需要對用戶名和密碼的合法性進行檢查。或許進行資料庫的查詢,或許從 dbm 文件中檢索。
請注意由 Internet Explorer 瀏覽器本身的問題帶來的錯誤。它對表頭訊息的順序顯得似乎有點吹毛求疵。目前在 HTTP/1.0 401 頭之前發送 WWW-Authenticate 表頭訊息能解決該問題。
為了防止有人編寫惡意代碼來顯示為以前通過傳統外部機制認証的頁面提供的密碼,當某些頁面的外部認証被啟動時,PHP_AUTH 變數將不會被設置。在這種情況下,我們可以使用 REMOTE_USER 變數來辨別外部認証的用戶,即 $_SERVER['REMOTE_USER']。
設置問題: PHP 用 AuthType 選項來判斷外部認証機制是否有效。當您希望使用 PHP 認証的時候,請記得關閉該選項,否則任何認証的嘗試操作都會失敗。
注意,這仍然不能防止有人通過未認証的 URL 來從同一伺服器上認証的 URL 上偷取密碼。
Netscape Navigator 和 Internet Explorer 瀏覽器都會在收到 401 的伺服端傳回訊息時清空所有的本地瀏覽器整個域的 Windows 認証緩存。這能夠有效的注銷一個用戶,並迫使他們重新輸入他們的用戶名和密碼。有些人用這種方法來使登錄狀態“過期”,或者作為“注銷”按鈕的響應行為。
例子 16-2. 強迫重新輸入用戶名和密碼的 HTTP 認証的範例
|
該行為對於 HTTP 基本認証標準來說並不是必須的,因此您不能依靠這種方法。對 Lynx 瀏覽器的測試表明 Lynx 在收到 401 的伺服端傳回訊息時不會清空認証文件,因此只要對認証文件的檢查要求沒有變化,只要用戶點擊“後退”按鈕,再點擊“前進”按鈕,其原有資源仍然能夠被連接。不過,用戶可以通過按“_”鍵來清空他們的認証訊息。
同時請注意,由於微軟的 IIS 伺服器的一些限制,該功能對 IIS 和 PHP 的 CGI 版本不適用。
註: 如果安全模式被啟動,腳本的 UID 會被加到 WWW-Authenticate 表頭訊息的 realm 部分。