$user['id'], 'login' => $user['Login'], 'acl' => $user['rights'], 'ip' => get_client_ip(), 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'created' => time() ]; // Запись сессии в БД $sessionId = mysqli_real_escape_string($db, session_id()); $ip = mysqli_real_escape_string($db, $_SESSION['ip']); $userAgent = mysqli_real_escape_string($db, $_SESSION['user_agent']); $time = time(); // Запись в БД $sessionId = mysqli_real_escape_string($db, session_id()); $query = "INSERT INTO ".USER_SESSIONS_TABLE." (session_id, user_id, ip_address, user_agent, created_at, last_activity) VALUES ( '$sessionId', {$user['id']}, '$ip', '$userAgent', $time, $time )"; if (!mysqli_query($db, $query)) { error_log("Session DB error: ".mysqli_error($db)); return false; } return true; } function validate_session($db) { // Проверка IP и User-Agent if ($_SESSION['ip'] !== get_client_ip() || $_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) { logout($db); return false; } // Проверка активности сессии в БД $sessionId = mysqli_real_escape_string($db, session_id()); $result = mysqli_query($db, "SELECT 1 FROM ".USER_SESSIONS_TABLE." WHERE session_id = '$sessionId' AND user_id = {$_SESSION['user_id']} AND is_active = 1 LIMIT 1"); if (!$result || mysqli_num_rows($result) === 0) { logout($db); return false; } // Обновление времени активности mysqli_query($db, "UPDATE ".USER_SESSIONS_TABLE." SET last_activity = ".time()." WHERE session_id = '$sessionId'"); return true; } function get_client_ip() { foreach (['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'] as $key) { if (!empty($_SERVER[$key])) { $ip = trim(current(explode(',', $_SERVER[$key]))); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } return '127.0.0.1'; } // Авторизация по API-ключу (без пароля) function IsSilentAuthenticated($db) { if (!empty($_SESSION['user_id'])) { return true; } $auth_ip = get_user_ip(); $api_key = ''; // Получаем ключ из GET или POST if (!empty($_GET['api_key'])) { $api_key = trim($_GET['api_key']); } elseif (!empty($_POST['api_key'])) { $api_key = trim($_POST['api_key']); } if (!empty($_GET['login'])) { $login = trim($_GET['login']); } elseif (!empty($_POST['login'])) { $login = trim($_POST['login']); } if (empty($login) || empty($api_key) || strlen($api_key) < 20) { return false; } // Экранирование и подготовка $login = mysqli_real_escape_string($db, $login); $api_key = mysqli_real_escape_string($db, $api_key); // Ищем пользователя с таким логином и API-ключом $query = "SELECT id, rights FROM Customers WHERE Login = '$login' AND api_key = '$api_key' LIMIT 1"; $result = mysqli_query($db, $query); if (!$result || mysqli_num_rows($result) === 0) { error_log("API auth failed for: $login"); return false; } $user = mysqli_fetch_assoc($result); // Создаем сессию $_SESSION = [ 'user_id' => $user['id'], 'login' => $login, 'acl' => $user['rights'], 'ip' => $auth_ip, 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'api_auth' => true // Метка API-аутентификации ]; LOG_INFO($db, "Logged in to api customer id: ".$_SESSION['user_id']." name: ".$_SESSION['login']." from ".$_SESSION['ip']." with acl: ".$_SESSION['acl']); return true; } // Выход из системы (полная версия) function logout($db, $silent = FALSE, $redirect_url = DEFAULT_PAGE) { if (session_status() === PHP_SESSION_ACTIVE) { LOG_INFO($db, "Logout customer id: ".$_SESSION['user_id']." name: ".$_SESSION['login']." from ".$_SESSION['ip']." with acl: ".$_SESSION['acl']); // Деактивация сессии в БД $sessionId = mysqli_real_escape_string($db, session_id()); mysqli_query($db, "UPDATE ".USER_SESSIONS_TABLE." SET is_active = 0 WHERE session_id = '$sessionId'"); // Очистка данных $_SESSION = []; session_destroy(); setcookie(session_name(), '', time() - SESSION_LIFETIME, '/'); // Удаление авторизационной куки (если есть) if (isset($_COOKIE['Auth'])) { setcookie('Auth', '', time() - SESSION_LIFETIME, '/'); } } if (!$silent) { if ($redirect_url == DEFAULT_PAGE) { header('Location: '.LOGIN_PAGE); } else { header('Location: '.LOGIN_PAGE.'?redirect_url='.$redirect_url); } } } // Инициализация системы сессий init_db_sessions($db_link); // Инициализация сессии if (session_status() !== PHP_SESSION_ACTIVE) { // Старт сессии с безопасными настройками session_start([ 'cookie_lifetime' => SESSION_LIFETIME , // 'cookie_secure' => true, // 'cookie_httponly' => true, 'cookie_samesite' => 'Strict', 'gc_maxlifetime' => SESSION_LIFETIME ]); }