在網站開發中,常需要限制特定頁面僅允許特定用戶存取。最常見的做法是建立資料庫儲存帳號密碼,但對於簡單的專案或不想引入資料庫的情況,使用文字檔搭配 PHP 處理驗證是一個輕量且快速的替代方案。本文將詳細說明如何建立一個基於文字檔的密碼驗證機制,並進一步加入 MD5 雜湊加密提升安全性。
整個流程包含三個核心部分:
建立一個簡單的 HTML 表單,重點在於 method="post" 以及 action 指向處理驗證的 PHP 檔案(例如 restricted.php)。
<form name="passwordForm" method="post" action="restricted.php"> <p>Password: <input type="password" name="password"> <input type="submit" name="Submit" value="Login"> </p> </form>
使用 fopen()、fread()、fclose() 三個檔案函數讀取密碼檔內容。
$fileloc = "/apachesite/docs/pass.txt"; // 密碼檔路徑
$filetoread = fopen($fileloc, "r") or die("Could not open password file");
$storedpass = fread($filetoread, filesize($fileloc)) or die("Could not read stored password");
fclose($filetoread);
透過 $_POST["password"] 取得表單傳來的密碼,依序檢查:是否為空、是否與儲存密碼相符。
$password = $_POST["password"];
if (empty($password)) {
die("No password entered");
} elseif ($password != $storedpass) {
die("Password Incorrect");
} else {
header("Location: securepage.htm");
}
注意:若出現Cannot modify header information錯誤,請在php.ini中將output_buffering設為On,或確保在輸出任何內容前就呼叫header()。
明文儲存密碼風險極高,建議將密碼以 MD5 雜湊後再寫入文字檔。驗證時同樣將使用者輸入做 MD5 後再比對。
先在程式中暫時註解比對邏輯,改用 echo md5($password); 取得雜湊值,複製該字串存入 pass.txt,完成後再還原比對程式碼。
$md5password = md5($password);
if (empty($password)) {
die("No password entered");
} elseif ($md5password != $storedpass) {
die("Password Incorrect");
} else {
header("Location: securepage.htm");
}
由於空字串經 MD5 仍會產生 32 位元雜湊值,因此 empty($password) 判斷必須放在加密之前,避免誤判。
pass.txt 放置於 PHP 檔同目錄,內容為明文或 MD5 密碼。| 優點 | 缺點 |
|---|---|
| 程式碼極少、無需資料庫、部署快速 | 安全性較低、無法支援多用戶/角色管理、密碼需人工分發 |
適合:內部測試頁面、簡單的靜態網站區塊保護、臨時性存取控制。不適合:高安全性需求、大量用戶管理、需記錄存取日誌的系統。
sleep(2) 延遲或失敗次數鎖定,防禦暴力破解。password_hash() / password_verify() 取代 MD5,符合現代最佳實務。$_SESSION['auth'] = true,在受保護頁面檢查 Session 而非單純依賴導向。透過本文的完整範例,您可以在幾分鐘內為網站加上基本的密碼保護層。雖然無法取代完整的會員系統,但在輕量級需求下是極佳的快速解決方案。