redirectToLogin(); return; } // 提取 IP 前三段(IPv4) function get_ip_prefix($ip, $segments = 3) { if (empty($ip)) return ''; $parts = explode('.', $ip); if (count($parts) < 4) return $ip; // IPv6 或其他格式,直接返回 return implode('.', array_slice($parts, 0, $segments)); } // 宽松 IP 检查(只比对前三段,例如 192.168.1.xxx) $currentIp = $_SERVER['REMOTE_ADDR'] ?? ''; $sessionIp = $_SESSION['web_ip'] ?? ''; if (!empty($currentIp) && !empty($sessionIp)) { $current_ip_prefix = get_ip_prefix($currentIp, 3); $session_ip_prefix = get_ip_prefix($sessionIp, 3); if ($current_ip_prefix !== $session_ip_prefix) { session_destroy(); $this->redirectToLogin(); return; } } // User Agent 检查 $currentUa = $_SERVER['HTTP_USER_AGENT'] ?? ''; $sessionUa = $_SESSION['web_ua'] ?? ''; if (!empty($currentUa) && !empty($sessionUa) && $currentUa !== $sessionUa) { session_destroy(); $this->redirectToLogin(); return; } // 会话超时检查 $lastActivity = $_SESSION['web_last_activity'] ?? 0; if (time() - $lastActivity > $timeout) { session_destroy(); $this->redirectToLogin(); return; } // 更新最后活动时间 $_SESSION['web_last_activity'] = time(); } /** * 重定向到登录页面 */ private function redirectToLogin() { $currentUrl = $_SERVER['REQUEST_URI'] ?? '/'; $loginUrl = '/login?redirect=' . urlencode($currentUrl); if ( !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' ) { // AJAX 请求,返回 JSON header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'redirect' => $loginUrl, 'message' => 'Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại!' ]); } else { // 普通请求,重定向 header('Location: ' . $loginUrl); } exit; } /** * 获取当前登录用户ID */ protected function getCurrentUserId() { if (session_status() === PHP_SESSION_NONE) { session_start(); } return $_SESSION['web_user_id'] ?? null; } /** * 获取当前登录用户名 */ protected function getCurrentUsername() { if (session_status() === PHP_SESSION_NONE) { session_start(); } return $_SESSION['web_username'] ?? null; } }