SESSION_LIFETIME) { // 销毁过期会话 $_SESSION = []; if (ini_get('session.use_cookies')) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']); } if (session_status() === PHP_SESSION_ACTIVE) { session_destroy(); } return false; } // 用户请求了新数据,刷新会话有效期 $_SESSION['last_activity'] = time(); return true; } /** * 验证访问密码并建立登录会话 * 使用 hash_equals 进行时序安全比对,防止时序攻击 * * @param string $password 用户提交的访问密码 * @return bool 是否登录成功 */ function attemptLogin($password) { if (!defined('API_PASS')) { return false; } if (hash_equals(API_PASS, (string)$password)) { // 会话固定攻击防护:重新生成会话ID session_regenerate_id(true); $_SESSION['admin_logged_in'] = true; $_SESSION['last_activity'] = time(); return true; } return false; } /** * 强制要求登录认证 * 未认证时输出登录页面并终止当前脚本 * 已认证时直接返回,不影响后续流程 * * @param string $redirect 登录成功后跳转的站内地址(可选,默认回到当前页面) */ function requireAuth($redirect = '') { if (isLoggedIn()) { return; } // 处理登录表单提交(POST 携带 auth_password) $error = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['auth_password'])) { if (attemptLogin($_POST['auth_password'])) { // 登录成功,跳转回目标页面 $target = !empty($_POST['redirect']) ? trim($_POST['redirect']) : $redirect; // 仅允许站内跳转,防止开放重定向 if ($target && strpos($target, '://') === false && strpos($target, '\\') === false) { header('Location: ' . $target); } else { header('Location: ' . $_SERVER['PHP_SELF']); } exit; } $error = '访问密码错误,请重试!'; } // 构造登录成功后返回的地址(默认当前请求地址) $currentPage = $_SERVER['PHP_SELF']; $queryString = $_SERVER['QUERY_STRING'] ?? ''; $redirectTarget = !empty($redirect) ? $redirect : ($queryString ? $currentPage . '?' . $queryString : $currentPage); // 输出登录页面 header('Content-Type: text/html; charset=utf-8'); ?>
请输入访问密码以进入管理面板