請製作一個PHP8的is_admin()函數,該函數會在每一個php檔前執行,用來判斷是否有登入。登入機制是透過以下的.htaccess來登入,並以bcrypt 加密方式建立帳號,登入後請紀錄到session,以便其他地方用來判斷是否有登入?
<Files admin.php>
AuthType Basic
AuthName "Restricted Area"
AuthUserFile "C:/UniServerZ/www/php8/.htpasswd"
Require valid-user
</Files>
is_admin()
用來判斷,logout_admin()
用來登出,我們可將之放在 function.php
的最後面:
<?php
session_start();
function is_admin() {
// 如果 session 中已有登入狀態,直接返回 true
if (isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true) {
return true;
}
// 檢查 HTTP 認證
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
return false;
}
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
// 讀取 .htpasswd 文件
$htpasswd_path = "C:/UniServerZ/www/php8/.htpasswd";
$htpasswd_content = file_get_contents($htpasswd_path);
$lines = explode("\n", $htpasswd_content);
foreach ($lines as $line) {
$parts = explode(':', $line);
if (count($parts) == 2) {
$stored_username = trim($parts[0]);
$stored_hash = trim($parts[1]);
if ($username === $stored_username && password_verify($password, $stored_hash)) {
// 認證成功,設置 session
$_SESSION['is_admin'] = true;
$_SESSION['admin_username'] = $username;
return true;
}
}
}
return false;
}
function logout_admin() {
// 清除 session
unset($_SESSION['is_admin']);
unset($_SESSION['admin_username']);
session_destroy();
// 清除 HTTP 認證
header('WWW-Authenticate: Basic realm="Restricted Area"');
header('HTTP/1.0 401 Unauthorized');
exit;
}
header.php
,在最前面加入啟用 session 功能
<?php
session_start();
require 'function.php';
require 'vendor/autoload.php';
...略...
admin.php
,在最前面加入判斷
<?php
require 'header.php';
if (!is_admin()) {
header('HTTP/1.0 403 Forbidden');
echo "帳密錯誤,無法存取";
exit;
}
// 過濾外部傳來變數
$op = filter_input_var('op');
...略...
請用PHP8製作登出功能 logout_admin()
function logout_admin()
{
// 清除所有 session 變數
$_SESSION = array();
// 如果使用了 session cookie,現在刪除它
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 銷毀 session
session_destroy();
// 清除 HTTP 基本認證
header('WWW-Authenticate: Basic realm="Restricted Area"');
header('HTTP/1.0 401 Unauthorized');
// 可選:重定向到登入頁面或首頁
header('Location: index.php'); // 或者 header('Location: index.php');
exit;
}