$message, 'code' => $code, 'timestamp' => date('c') ]; if ($details) { $error['details'] = $details; } echo json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); exit(); } /** * Проверка лимита запросов */ function checkRateLimit($max_requests) { $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $cache_file = sys_get_temp_dir() . '/umbrix_ratelimit_' . md5($ip); $current_time = time(); $window_start = $current_time - 60; // Окно в 1 минуту $requests = []; if (file_exists($cache_file)) { $requests = json_decode(file_get_contents($cache_file), true) ?? []; } // Удаляем старые запросы $requests = array_filter($requests, function($timestamp) use ($window_start) { return $timestamp > $window_start; }); // Проверяем лимит if (count($requests) >= $max_requests) { return false; } // Добавляем текущий запрос $requests[] = $current_time; file_put_contents($cache_file, json_encode($requests)); return true; } /** * Логирование запроса */ function logRequest($log_file) { $log_dir = dirname($log_file); if (!is_dir($log_dir)) { mkdir($log_dir, 0755, true); } $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'; $request_uri = $_SERVER['REQUEST_URI'] ?? 'unknown'; $timestamp = date('Y-m-d H:i:s'); // Извлекаем версию приложения из User-Agent (если есть) $app_version = 'unknown'; if (preg_match('/Umbrix\/([0-9.]+)/', $user_agent, $matches)) { $app_version = $matches[1]; } $log_entry = sprintf( "[%s] IP: %s | App Version: %s | URI: %s | User-Agent: %s\n", $timestamp, $ip, $app_version, $request_uri, $user_agent ); file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); } ?>