root 1 год назад
Родитель
Сommit
9bf4d24748
1 измененных файлов с 84 добавлено и 40 удалено
  1. 84 40
      html/inc/auth.utils.php

+ 84 - 40
html/inc/auth.utils.php

@@ -8,11 +8,18 @@ require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/common.php");
 
 
 ini_set('session.use_trans_sid', true);
 ini_set('session.use_trans_sid', true);
 ini_set('session.use_only_cookies', false);
 ini_set('session.use_only_cookies', false);
-ini_set('session.gc_maxlifetime', 3600*24);
 
 
 define('SESSION_TABLE', 'sessions');
 define('SESSION_TABLE', 'sessions');
 define('USER_SESSIONS_TABLE', 'user_sessions');
 define('USER_SESSIONS_TABLE', 'user_sessions');
 
 
+//set default const values
+if (!defined('SESSION_LIFETIME') || SESSION_LIFETIME < 60) { define('SESSION_LIFETIME', 86400); }
+if (!defined("HTML_LANG")) { define("HTML_LANG","english"); }
+if (!defined("HTML_STYLE")) { define("HTML_STYLE","white"); }
+if (!defined("IPCAM_GROUP_ID")) { define("IPCAM_GROUP_ID","5"); }
+if (!defined("SNMP_timeout")) { define("SNMP_timeout","500000"); }
+if (!defined("SNMP_retry")) { define("SNMP_retry","1"); }
+
 // Инициализация сессий в БД
 // Инициализация сессий в БД
 function init_db_sessions($db) {
 function init_db_sessions($db) {
     // Настройка обработчиков сессий
     // Настройка обработчиков сессий
@@ -27,7 +34,7 @@ function init_db_sessions($db) {
     register_shutdown_function('session_write_close');
     register_shutdown_function('session_write_close');
 }
 }
 
 
-// Обработчики сессий (процедурный стиль)
+// Обработчики сессий
 function sess_open($savePath, $sessionName) { return true; }
 function sess_open($savePath, $sessionName) { return true; }
 function sess_close() { return true; }
 function sess_close() { return true; }
 
 
@@ -35,7 +42,11 @@ function sess_read($sessionId) {
     global $db_link;
     global $db_link;
     $sessionId = mysqli_real_escape_string($db_link, $sessionId);
     $sessionId = mysqli_real_escape_string($db_link, $sessionId);
     $result = mysqli_query($db_link, "SELECT data FROM ".SESSION_TABLE." WHERE id = '$sessionId'");
     $result = mysqli_query($db_link, "SELECT data FROM ".SESSION_TABLE." WHERE id = '$sessionId'");
-    return $result && mysqli_num_rows($result) ? mysqli_fetch_assoc($result)['data'] : '';
+    if (!$result) {
+        error_log("Session read failed: " . mysqli_error($db_link));
+        return '';
+    }
+    return mysqli_num_rows($result) ? mysqli_fetch_assoc($result)['data'] : '';
 }
 }
 
 
 function sess_write($sessionId, $data) {
 function sess_write($sessionId, $data) {
@@ -46,34 +57,37 @@ function sess_write($sessionId, $data) {
     $query = "INSERT INTO ".SESSION_TABLE." (id, data, last_accessed) 
     $query = "INSERT INTO ".SESSION_TABLE." (id, data, last_accessed) 
               VALUES ('$sessionId', '$data', $time)
               VALUES ('$sessionId', '$data', $time)
               ON DUPLICATE KEY UPDATE data = '$data', last_accessed = $time";
               ON DUPLICATE KEY UPDATE data = '$data', last_accessed = $time";
-    return mysqli_query($db_link, $query);
+
+    if (!mysqli_query($db_link, $query)) {
+        error_log("Session write failed: " . mysqli_error($db_link));
+        return false;
+    }
+    return true;
 }
 }
 
 
 function sess_destroy($sessionId) {
 function sess_destroy($sessionId) {
     global $db_link;
     global $db_link;
     $sessionId = mysqli_real_escape_string($db_link, $sessionId);
     $sessionId = mysqli_real_escape_string($db_link, $sessionId);
-    return mysqli_query($db_link, "DELETE FROM ".SESSION_TABLE." WHERE id = '$sessionId'");
+    if (!mysqli_query($db_link, "DELETE FROM ".SESSION_TABLE." WHERE id = '$sessionId'")) {
+        error_log("Session destroy failed: " . mysqli_error($db_link));
+        return false;
+    }
+    return true;
 }
 }
 
 
 function sess_gc($maxLifetime) {
 function sess_gc($maxLifetime) {
     global $db_link;
     global $db_link;
     $old = time() - $maxLifetime;
     $old = time() - $maxLifetime;
-    return mysqli_query($db_link, "DELETE FROM ".SESSION_TABLE." WHERE last_accessed < $old");
+    if (!mysqli_query($db_link, "DELETE FROM ".SESSION_TABLE." WHERE last_accessed < $old")) {
+        error_log("Session GC failed: " . mysqli_error($db_link));
+        return false;
+    }
+    return true;
 }
 }
 
 
-// Инициализация системы сессий
-init_db_sessions($db_link);
-
-// Старт сессии с безопасными настройками
-session_start([
-    'cookie_lifetime' => 86400 * 30,
-    'cookie_secure'   => true,
-    'cookie_httponly' => true,
-    'cookie_samesite' => 'Strict',
-    'gc_maxlifetime' => 86400 * 30
-]);
 
 
 function login($db) {
 function login($db) {
+
     // 1. Проверка активной сессии
     // 1. Проверка активной сессии
     if (!empty($_SESSION['user_id']) && validate_session($db)) {
     if (!empty($_SESSION['user_id']) && validate_session($db)) {
         // Дополнительная валидация сессии
         // Дополнительная валидация сессии
@@ -105,39 +119,42 @@ function login($db) {
 }
 }
 
 
 function authenticate_by_credentials($db,$login,$password) {
 function authenticate_by_credentials($db,$login,$password) {
+
     $login = mysqli_real_escape_string($db, trim($login));
     $login = mysqli_real_escape_string($db, trim($login));
     $query = "SELECT * FROM `Customers` WHERE Login='{$login}'";
     $query = "SELECT * FROM `Customers` WHERE Login='{$login}'";
     $user = get_record_sql($db, $query);
     $user = get_record_sql($db, $query);
-    if (!empty($user)) {
-        if (!password_verify($password, $user['password'])) {
-            sleep(1);
-            return false;
-            }
-        } else {
-            sleep(1);
-            return false;
-        }
+
+    if (empty($user)) {
+        sleep(1);
+        return false;
+    }
+
+    if (!password_verify($password, $user['password'])) {
+        sleep(1);
+        return false;
+    }
 
 
     // Создание сессии
     // Создание сессии
     session_regenerate_id(true);
     session_regenerate_id(true);
-    
+
     $_SESSION = [
     $_SESSION = [
         'user_id'    => $user['id'],
         'user_id'    => $user['id'],
         'login'      => $user['Login'],
         'login'      => $user['Login'],
         'acl'        => $user['rights'],
         'acl'        => $user['rights'],
         'ip'         => get_client_ip(),
         'ip'         => get_client_ip(),
-        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
+        'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
         'created'    => time()
         'created'    => time()
     ];
     ];
-    
+
     // Запись сессии в БД
     // Запись сессии в БД
     $sessionId = mysqli_real_escape_string($db, session_id());
     $sessionId = mysqli_real_escape_string($db, session_id());
     $ip = mysqli_real_escape_string($db, $_SESSION['ip']);
     $ip = mysqli_real_escape_string($db, $_SESSION['ip']);
     $userAgent = mysqli_real_escape_string($db, $_SESSION['user_agent']);
     $userAgent = mysqli_real_escape_string($db, $_SESSION['user_agent']);
     $time = time();
     $time = time();
 
 
-    mysqli_query($db, 
-        "INSERT INTO ".USER_SESSIONS_TABLE." 
+    // Запись в БД
+    $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) 
         (session_id, user_id, ip_address, user_agent, created_at, last_activity) 
         VALUES (
         VALUES (
             '$sessionId',
             '$sessionId',
@@ -146,19 +163,24 @@ function authenticate_by_credentials($db,$login,$password) {
             '$userAgent',
             '$userAgent',
             $time,
             $time,
             $time
             $time
-        )");
+        )";
+    if (!mysqli_query($db, $query)) {
+        error_log("Session DB error: ".mysqli_error($db));
+        return false;
+    }
 
 
     return true;
     return true;
 }
 }
 
 
 function validate_session($db) {
 function validate_session($db) {
+
     // Проверка IP и User-Agent
     // Проверка IP и User-Agent
     if ($_SESSION['ip'] !== get_client_ip() || 
     if ($_SESSION['ip'] !== get_client_ip() || 
         $_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) {
         $_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) {
         logout($db);
         logout($db);
         return false;
         return false;
     }
     }
-    
+
     // Проверка активности сессии в БД
     // Проверка активности сессии в БД
     $sessionId = mysqli_real_escape_string($db, session_id());
     $sessionId = mysqli_real_escape_string($db, session_id());
     $result = mysqli_query($db, 
     $result = mysqli_query($db, 
@@ -169,24 +191,31 @@ function validate_session($db) {
             user_id = {$_SESSION['user_id']} AND
             user_id = {$_SESSION['user_id']} AND
             is_active = 1
             is_active = 1
          LIMIT 1");
          LIMIT 1");
-    
+
     if (!$result || mysqli_num_rows($result) === 0) {
     if (!$result || mysqli_num_rows($result) === 0) {
         logout($db);
         logout($db);
         return false;
         return false;
     }
     }
-    
+
     // Обновление времени активности
     // Обновление времени активности
     mysqli_query($db, 
     mysqli_query($db, 
         "UPDATE ".USER_SESSIONS_TABLE." 
         "UPDATE ".USER_SESSIONS_TABLE." 
          SET last_activity = ".time()." 
          SET last_activity = ".time()." 
          WHERE session_id = '$sessionId'");
          WHERE session_id = '$sessionId'");
-    
+
     return true;
     return true;
 }
 }
 
 
-// Вспомогательная функция
 function get_client_ip() {
 function get_client_ip() {
-    return $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
+    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-ключу (без пароля)
 // Авторизация по API-ключу (без пароля)
@@ -257,10 +286,10 @@ function logout($db, $silent = FALSE) {
         // Очистка данных
         // Очистка данных
         $_SESSION = [];
         $_SESSION = [];
         session_destroy();
         session_destroy();
-        setcookie(session_name(), '', time() - 3600, '/');
+        setcookie(session_name(), '', time() - SESSION_LIFETIME, '/');
         // Удаление авторизационной куки (если есть)
         // Удаление авторизационной куки (если есть)
         if (isset($_COOKIE['Auth'])) {
         if (isset($_COOKIE['Auth'])) {
-            setcookie('Auth', '', time() - 3600, '/');
+            setcookie('Auth', '', time() - SESSION_LIFETIME, '/');
         }
         }
     }
     }
     if (!$silent) {
     if (!$silent) {
@@ -268,3 +297,18 @@ function logout($db, $silent = FALSE) {
         //?redirect=' . urlencode($_SERVER['REQUEST_URI']));
         //?redirect=' . urlencode($_SERVER['REQUEST_URI']));
         }
         }
 }
 }
+
+// Инициализация системы сессий
+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
+        ]);
+    }