load(); } // Set default environment variables $_ENV['APP_NAME'] = $_ENV['APP_NAME'] ?? 'SoftEdge Corporation'; $_ENV['APP_URL'] = $_ENV['APP_URL'] ?? 'https://softedge-corporation.up.railway.app'; $_ENV['APP_ENV'] = $_ENV['APP_ENV'] ?? 'production'; // Security headers header('X-Content-Type-Options: nosniff'); header('X-Frame-Options: DENY'); header('X-XSS-Protection: 1; mode=block'); header('Referrer-Policy: strict-origin-when-cross-origin'); // Content Security Policy header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://unpkg.com https://cdn.tailwindcss.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self'"); // Create logs directory if it doesn't exist $logsDir = __DIR__ . '/../logs'; if (!is_dir($logsDir)) { mkdir($logsDir, 0755, true); } // Set custom error log ini_set('error_log', $logsDir . '/php_errors.log'); // Function to get base URL function getBaseUrl(): string { $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST'] ?? 'localhost'; $port = $_SERVER['SERVER_PORT'] ?? 80; // Don't include port if it's the default for the protocol if (($protocol === 'http' && $port == 80) || ($protocol === 'https' && $port == 443)) { return $protocol . '://' . $host; } return $protocol . '://' . $host . ':' . $port; } // Function to get current URL function getCurrentUrl(): string { return getBaseUrl() . $_SERVER['REQUEST_URI']; } // Function to redirect function redirect(string $url, int $statusCode = 302): void { header('Location: ' . $url, true, $statusCode); exit; } // Function to sanitize input function sanitizeInput(string $input): string { return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8'); } // Function to generate CSRF token function generateCsrfToken(): string { if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['csrf_token']; } // Function to validate CSRF token function validateCsrfToken(string $token): bool { return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } // Function to log activity function logActivity(string $message, string $level = 'INFO'): void { $logFile = __DIR__ . '/../logs/activity.log'; $timestamp = date('Y-m-d H:i:s'); $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'; $logEntry = "[$timestamp] [$level] [$ip] [$userAgent] $message" . PHP_EOL; file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX); } // Function to check if user is rate limited function isRateLimited(string $identifier, int $maxRequests = 5, int $timeWindow = 300): bool { $rateLimitFile = __DIR__ . "/../logs/rate_limit_{$identifier}.txt"; $currentTime = time(); // Read existing requests $requests = []; if (file_exists($rateLimitFile)) { $requests = json_decode(file_get_contents($rateLimitFile), true) ?? []; } // Filter out old requests $requests = array_filter($requests, function($timestamp) use ($currentTime, $timeWindow) { return ($currentTime - $timestamp) < $timeWindow; }); // Check if rate limit exceeded if (count($requests) >= $maxRequests) { return true; } // Add current request $requests[] = $currentTime; // Save updated requests file_put_contents($rateLimitFile, json_encode($requests)); return false; } // Initialize application logActivity("Application initialized"); // Autoload classes (Composer will handle this) require_once __DIR__ . '/../vendor/autoload.php';