"; $alertafin="

"; $scriptfile="file4"; //no cambiar este nombre por que se decalibran varias cosas $scriptfm = $scriptfile; $scriptfm = strtoupper($scriptfm); #pasar a mayuscula $mod = isset($_GET['mod']) ? $_GET['mod'] : ''; // algunas cositas van con mod $expire_time = time() + 2592000; //valor puesto para 30 dias #$ippublic = file_get_contents('https://api.ipify.org/'); //solo con internet //$miip = $_SERVER['REMOTE_ADDR']; //mod ip real $theip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR']; $miip = explode(',', $theip)[0]; $haship = hash('sha256', $miip); $ihash = hash('sha256', $miip . $pepper); // Usamos el Pepper para mayor seguridad $archivo_bloqueo = 'bloqueo.lock'; $segundos_bloqueo = 20; $is_authenticated = false; // Por defecto nadie está autenticado $master = ""; // Inicializar para evitar errores $acceso_emergencia = false; //aqui siempre false $archivo_registro_unlock = 'unlocks_hist.log'; // Registro de timestamps, no hace falta cambiar $limite_horas = 24 * 3600; // 24 horas en segundos $master_key = substr($tokenplus, 0, 5); //estoy servira para el unlock $publicKeyBase64 = '3JBT7LrYkydYPS3upQhJwB8pEi12nEfi2rbSTVIw/cs='; //codigo inmutable $totalArchivos = 0; $totalCarpetas = 0; $totalPesoCarpeta = 0; $furlVersionCheck = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/file4.php'; $version_cache_file = __DIR__ . '/.htversion_cache'; // prefijo .ht = bloqueado por Apache automáticamente $version_cache_segundos = 6 * 3600; // revisa como máximo cada 6 horas // 1. Detectar y crear ruta basandonos en la url del scrip $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $script_url = $_SERVER['SCRIPT_NAME']; $url_limpia = $protocol . $host . $script_url; //convertir a hash corto $hash_mini_id = substr(md5($url_limpia), 0, 5); $hash_mini_id2 = substr(md5($tokenplus), 0, 10); ////Cookie Reforce $cookiePath = "/"; // Simplificado para evitar errores de parseo $cookieParams = "; SameSite=Lax"; // Lax es compatible con HTTPS y redirecciones $cookieDomain = ""; // Dejar vacío para el host actual $isSecure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on'); $isHttpOnly = true; // ACTIVADO: Protege contra robo por JavaScript //// // SESSION PHP - PREPARACION TIEMPO EXTENDIDO ob_start(); // 1. Siempre primero para evitar Error 500 // Configuración de duración: 1 meses en segundos $duracion = 5 * 60; // 5 minutos -- session PHPSESSION SERVER // $isSecure debe calcularse ANTES de este bloque (moverlo desde donde está más abajo) $isSecure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on'); // 2. Forzamos al servidor a mantener la sesión por 6 meses ini_set('session.gc_maxlifetime', $duracion); // Cuánto tiempo dura la COOKIE en el navegador, + flags de seguridad session_set_cookie_params([ 'lifetime' => $duracion, 'path' => '/', 'domain' => '', 'secure' => $isSecure, 'httponly' => true, 'samesite' => 'Lax', ]); // 3. Iniciamos la sesión if (session_status() === PHP_SESSION_NONE) { session_start(); } //////////////idioma predeterminado ES //////////////////// $tl = array( 'home' => 'Inicio', 'uploadfile' => 'Subir Archivo', 'name' => 'Nombre', 'size' => 'Tamaño', 'modified' => 'Modificado', 'permissions' => 'Permisos', 'owner' => 'Propietario', 'welcome' => 'Bienvenido', 'exit' => 'Salir', 'foldercontent' => 'Contenido de la carpeta', 'allowphpfile' => 'Permitir PHP', 'uploadmultiplefiles' => 'Subir multiples Archivos', 'systeminformation' => 'Informacion del Sistema', 'usedspace' => 'Espacio Usado', 'availablespace' => 'Espacio disponible', 'usedmemory' => 'Memoria usada', 'totalmemory' => 'Memoria total', 'processorusage' => 'Uso del procesador', 'coretemperature' => 'Temperatura del núcleo', 'operatingsystem' => 'Sistema operativo', 'description' => 'Notas: Utilitario simple y potente para la gestion de archivos en servidores web sin panel.', 'viewproyect' => 'Repositorio Github', 'editscript' => 'Editar Script', 'donatepaypal' => 'Donacion Paypal', 'averageload' => 'carga promedio', 'createdby' => 'creado por', 'folder' => 'Carpeta', 'system' => 'Sistema', 'deletenow' => 'Eliminar Ahora', 'qdelete' => 'Está seguro de eliminar', 'cancel' => 'Cancelar', 'thefile' => 'El Archivo', 'fileaction1' => 'ha sido subido exitosamente', 'createfile' => 'Crear Archivo', 'filename' => 'Nombre del archivo', 'createdby' => 'creado por', 'createfolder' => 'Crear Carpeta', 'foldername' => 'Nombre de la Carpeta', 'deletefolder' => 'Eliminar Carpeta', 'onlyempty' => 'Solo si esta vacio', 'configuration' => 'Configuracion', 'saveconfiguration' => 'Guardar Configuracion', 'deleteconfiguration' => 'Eliminar Configuracion', 'user' => 'Usuario', 'password' => 'Contraseña', 'email' => 'Correo Electronico', 'theme' => 'Tema', 'language' => 'Idioma', 'msgconfiguration' => 'Zona para configurar este sistema, el cual creara un archivo json para mantener la configuracion, no lo borre por que perdera la seguridad y cambios de esta configuracion', 'update' => 'Actualizar', 'cancel' => 'Cancelar', 'msgupdate' => 'A continuacion procederemos a actualizar este sistema a su ultima version', 'okupdate' => 'El Sistema se ha actualizado correctamente', 'reload' => 'Recargar', 'close' => 'Cerrar', 'savefile' => 'Guardar Archivo', 'discardchanges' => 'Descartar Cambios', 'editing' => 'Editando', 'delete' => 'Eliminar', 'edit' => 'Editar', 'compress' => 'Comprimir', 'information' => 'Informacion', 'copyfile' => 'Copiar Archivo', 'renamefile' => 'Renombrar Archivo', 'renamemove' => 'Renombrar o Mover', 'filesize' => 'Tamaño de Archivo', 'creationdate' => 'Fecha de Creación', 'lastaccessdate' => 'Fecha de último acceso', 'lastmodifieddate' => 'Fecha de última modificación', 'group' => 'Grupo', 'mimetype' => 'Tipo MIME', 'currentservertime' => 'Hora actual del servidor', 'fullpath' => 'Ruta Completa', 'msgcompress' => 'Si no pone contraseña, no hay problema', 'msgsavefile' => 'Texto guardado correctamente', 'activate' => 'Activar', 'desactivate' => 'Desactivar', 'createdby' => 'creado por', 'efile' => 'Archivo', 'summary' => 'Resumen', 'selectlanguage' => 'Seleccionar Idioma' ); // Verificar si la cookie 'language' está configurada if (isset($_COOKIE['language'])) { // Si existe, usar el valor de la cookie para definir el idioma $lang = $_COOKIE['language']; } else { // Si no existe, usar el idioma por defecto (español) $lang = 'es'; // Crear la cookie 'language' con el valor por defecto $options_lang = [ 'expires' => $expire_time, 'path' => '/', 'secure' => $isSecure, 'httponly' => false, // False para que JS pueda leer el idioma si es necesario 'samesite' => 'Lax' ]; //si no existe idioma graba en la cookie el español setcookie('language', $lang, $options_lang); } ///FUNCIONES ////// function xformatSize2($bytes) { $units = ['B', 'KB', 'MB', 'GB', 'TB']; $power = $bytes > 0 ? floor(log($bytes, 1024)) : 0; return number_format($bytes / pow(1024, $power), 2, '.', ',') . ' ' . $units[$power]; } function obtener_version_remota(string $url, string $cacheFile, int $cacheSegundos): ?string { // 1. Si hay caché reciente, la usamos y no tocamos la red if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheSegundos) { $cached = trim(@file_get_contents($cacheFile)); return $cached !== '' ? $cached : null; } // 2. Descarga con timeout corto para no colgar la página si GitHub está lento/caído $contexto = stream_context_create([ 'http' => ['timeout' => 3], 'https' => ['timeout' => 3], ]); $remoto = @file_get_contents($url, false, $contexto); // 3. Si falla la descarga, reusa la última versión conocida en caché (si existe) en vez de fallar en seco if ($remoto === false) { if (file_exists($cacheFile)) { $cached = trim(@file_get_contents($cacheFile)); return $cached !== '' ? $cached : null; } return null; } // 4. Extrae la versión del código fuente remoto, igual formato que $fversion="X.X.X"; if (!preg_match('/\$fversion\s*=\s*["\']([^"\']+)["\']/', $remoto, $m)) { return null; } $versionRemota = $m[1]; @file_put_contents($cacheFile, $versionRemota, LOCK_EX); return $versionRemota; } function hay_conexion_internet(string $host = 'raw.githubusercontent.com', int $puerto = 443, float $timeoutSegundos = 1.0): bool { $conexion = @fsockopen($host, $puerto, $errno, $errstr, $timeoutSegundos); if ($conexion) { fclose($conexion); return true; } return false; } // Función para cargar las traducciones desde el archivo JSON solo si se selecciona otro idioma function loadTranslations($lang) { $file = __DIR__ . "/$lang.json"; // Ruta al archivo JSON if (file_exists($file)) { $json_data = file_get_contents($file); // Leer el archivo JSON return json_decode($json_data, true); // Convertir JSON a array } return null; // Si no existe el archivo, devolver null } //funciones nuevas para mejorar la seguridad del config file function cfg_load(string $file): array { if (!file_exists($file)) return []; $fm_cfg = []; include $file; return $fm_cfg; } function cfg_save(array $data, string $file): bool { $export = var_export($data, true); return file_put_contents($file, "", LOCK_EX) !== false; } // Agregar funcion de auditoria function audit($action, $target = '') { global $hash_mini_id2, $miip; // <-- Esto le dice a PHP que busque la variable afuera $raw_user = $_SESSION['user_name'] ?? 'unknown'; // Ocultar el nombre: muestra las primeras 2 letras y rellena el resto con ***** if ($raw_user !== 'unknown' && strlen($raw_user) > 2) { $user = substr($raw_user, 0, 2) . '*****'; } elseif ($raw_user !== 'unknown' && strlen($raw_user) <= 2) { $user = $raw_user . '*****'; } else { $user = 'unknown'; } $ip = $miip ?? '0.0.0.0'; // Configuramos la zona horaria a GMT-5 temporalmente para este cálculo $fecha_gmt5 = new DateTime('now', new DateTimeZone('Etc/GMT+5')); $hora_actual = $fecha_gmt5->format('Y-m-d H:i:s'); @file_put_contents('.audit-' . ($hash_mini_id2 ?? 'unknown') . '.log', $hora_actual . " | $user | $ip | $action | $target\n", FILE_APPEND | LOCK_EX ); } ////////////////EOF-FUNCIONES/////////////// // Obtener el idioma desde la URL (por defecto español) if (isset($_GET['lang'])) { $options_lang = [ 'expires' => $expire_time, 'path' => '/', 'secure' => $isSecure, 'httponly' => false, 'samesite' => 'Lax' ]; $lang = $_GET['lang']; //esto graba el idioma elegido del menu idioma setcookie('language', $lang, $options_lang); } else { // Si no existe el parámetro lang en la URL, verificar si la cookie 'language' está configurada $lang = isset($_COOKIE['language']) ? $_COOKIE['language'] : 'es'; // Idioma por defecto 'es' } // Si el idioma no es español, cargar el archivo JSON correspondiente if ($lang !== 'es') { $loadedTranslations = loadTranslations($lang); if ($loadedTranslations !== null) { $tl = $loadedTranslations; // Sobrescribir las traducciones con las del archivo JSON } } //////////////idioma-EOF//////////////////// ///DEFINIR COLOR POR DOMINIO // Obtener el nombre del dominio actual $host = $_SERVER['HTTP_HOST']; // Crear un hash MD5 a partir del dominio $hash = md5($host); // Tomar los primeros 6 caracteres del hash como color hexadecimal $colorHex = '#' . substr($hash, 0, 6); $stylealert = << EOD; $newstylealert = << EOD; // ACCESO DE EMERGENCIA // --- CONTROL DE ACCESO DE EMERGENCIA ANTI-DDOS --- if (isset($_POST['unlock'])) { $ahora = time(); $registros = []; /////// Cargamos configuración para ver la IP de confianza ///////////////// // 1. DECLARACIÓN FALTANTE: Obtener y hashear la IP actual del visitante $mi_ip_actual = $miip; $mi_ip_actual_hash = hash('sha256', $mi_ip_actual . $pepper); // Usamos el Pepper para coincidir con 'ihash' $configData = cfg_load($configFile); $ip_confianza = isset($configData['ihash']) ? $configData['ihash'] : ''; // ¿Es el dueño en su IP de siempre? // $es_owner_reconocido = ($mi_ip_actual_hash === $ip_confianza); $es_owner_reconocido = hash_equals($ip_confianza, $mi_ip_actual_hash); // 1. Cargamos el historial existente if (file_exists($archivo_registro_unlock)) { $registros = explode("\n", trim(file_get_contents($archivo_registro_unlock))); } // 2. Filtramos los registros de las últimas 24 horas $registros_recientes = array_filter($registros, function($timestamp) use ($ahora, $limite_horas) { return ($ahora - (int)$timestamp) < $limite_horas; }); $conteo_intentos = count($registros_recientes); // LÓGICA: Auto-limpieza de logs para evitar inundacion en el log if ($conteo_intentos > 30) { // Si el log se ensucia demasiado, lo reseteamos a los últimos 5 para que no pese megabytes $registros_recientes = array_slice($registros_recientes, -5); } // 3. Verificamos si aún tiene intentos disponibles (Límite de 10) // logica maestra q verifica intentos o ip en json if ($conteo_intentos < 10 || $es_owner_reconocido) { // --- ACCIÓN FÍSICA SIEMPRE: Registramos el timestamp en el log --- // Esto sucede tanto si el token es "12345" como si es "pvt0z" $registros_recientes[] = $ahora; file_put_contents($archivo_registro_unlock, implode("\n", $registros_recientes)); // --- VALIDACIÓN LÓGICA PRIVADA --- // Solo si el token coincide exactamente con los primeros 5 caracteres de $tokenplus // file4.php?unlockmode if ($_POST['unlock'] === $master_key) { // SOLUCIÓN CAMBIO GET A POST: Guardamos el bypass en la sesión para que dure en la siguiente recarga $_SESSION['bypass_active'] = true; $_SESSION['bypass_time'] = time(); $acceso_emergencia = true; } // Si no es correcto, $acceso_emergencia se queda en false (valor por defecto) } else { // Bloqueo total si excedió los 10 registros en el log echo "$seguridadcabeza

🚫 Límite de Emergencia Agotado

Se han detectado $conteo_intentos intentos de acceso en las últimas 24 horas.

Por seguridad, esta función ha sido inhabilitada temporalmente.

"; exit; } } // 2. VERIFICACIÓN DE SESIÓN PARA EL BYPASS (Esto nose usaba en GET pero POST si necesita recordar $acceso_emergencia=true) if (isset($_SESSION['bypass_active']) && $_SESSION['bypass_active'] === true) { // El bypass dura (10 segundos) para que te dé tiempo a logearte if ((time() - $_SESSION['bypass_time']) < 10) { $acceso_emergencia = true; } else { unset($_SESSION['bypass_active'], $_SESSION['bypass_time']); } } // 4. MOSTRAR FORMULARIO DE DESBLOQUEO UNLOCK o BYPASS if (isset($_GET['bypass'])) { // echo "$newseguridadcabeza"; echo "
Bypass:
"; exit; } //////// VERIFICAR SEGURIDAD (FLUJO UNIFICADO Y GLOBAL) ///////////////////////// if (file_exists($configFile)) { $configData = cfg_load($configFile); $seguridadcabeza = "$stylealert

🌀 File Manager


"; $newseguridadcabeza = "$newstylealert "; // --- VARIABLES MAESTRAS --- $master = $configData['fuser']; $mastermail = $configData['fmail']; $tokenhash_db = $configData['fpass']; $tokenhash_valid = hash('sha256', "$tokenplus$tokenhost$tokenhash_db"); // 1. AUTO-LOGIN (Sincronizar Cookie con Sesión) if (!isset($_SESSION['user_auth']) || $_SESSION['user_auth'] !== true) { //------Debug zone-----// // include "debug.php"; if (isset($_COOKIE['Hash']) && hash_equals($tokenhash_valid, $_COOKIE['Hash']) && hash_equals($configData['fhash'], $haship)) { session_regenerate_id(true); $_SESSION['user_auth'] = true; $_SESSION['user_name'] = $master; } } $is_authenticated = (isset($_SESSION['user_auth']) && $_SESSION['user_auth'] === true); // 2. MURO DE BLOQUEO (Solo para no autenticados) if (!$is_authenticated && file_exists($archivo_bloqueo) && !$acceso_emergencia) { $intentos = (int)trim(file_get_contents($archivo_bloqueo)); if ($intentos < 1) $intentos = 1; $tiempo_creacion = filemtime($archivo_bloqueo); $segundos_espera = $segundos_bloqueo * pow(2, $intentos - 1); if ($segundos_espera > 86400) $segundos_espera = 86400; $tiempo_transcurrido = time() - $tiempo_creacion; if ($tiempo_transcurrido < $segundos_espera) { $restante = $segundos_espera - $tiempo_transcurrido; echo " $newseguridadcabeza
🌀 File4 Manager

Demasiados fallos detectados (Intento #$intentos).

Por seguridad, espere: " . gmdate("H:i:s", $restante) . "


"; //echo "intentadas fallidas area
"; exit; } } // 3. PROCESAR LOGIN POST if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['fuser'], $_POST['fpass'])) { // Honeypot check if (!empty($_POST['fhemail'])) { die("Bot detected."); } $peppered_input = hash_hmac("sha512", $_POST['fpass'], $pepper); if ($_POST['fuser'] === $master && password_verify($peppered_input, $configData['fpass'])) { // LOGIN EXITOSO audit('LOGIN_SUCCESS', 'owner en casa'); session_regenerate_id(true); $_SESSION['user_auth'] = true; $_SESSION['user_name'] = $master; if (file_exists($archivo_bloqueo)) { unlink($archivo_bloqueo); } $options = [ 'expires' => $expire_time, 'path' => $cookiePath, 'domain' => $cookieDomain, 'secure' => $isSecure, 'httponly' => $isHttpOnly, 'samesite' => 'Lax' ]; setcookie('loggedin', 'true', $options); setcookie('Hash', $tokenhash_valid, $options); $configData['fhash'] = $haship; $configData['ihash'] = $ihash; cfg_save($configData, $configFile); header("Location: $scriptfile.php"); exit; } else { // LOGIN FALLIDO audit('LOGIN_FAILED', $_POST['fuser'] ?? ''); $intentos = 1; if (file_exists($archivo_bloqueo)) { $contenido = trim(file_get_contents($archivo_bloqueo)); $intentos = (is_numeric($contenido)) ? (int)$contenido + 1 : 1; } file_put_contents($archivo_bloqueo, (string)$intentos, LOCK_EX); header("Location: $scriptfile.php"); // Redirigimos para que el "Muro" arriba atrape el bloqueo exit; } } // 4. MOSTRAR FORMULARIO (Si no está autenticado) if (!$is_authenticated) { $loginzone = <<
🌀 File4 Manager
EOD; echo "$newseguridadcabeza"; echo "$loginzone"; exit; } } //////// VERIFICAR SEGURIDAD FIN ///////////////////////// if (isset($_GET['test'])) { echo "prueba master es $master"; exit; } //Zona Download file/////////////////////////////////////// if (isset($_GET['dfile'])) { // 1. PROTECCIÓN DE SESIÓN: Si no está autenticado, el script muere aquí. if (!isset($is_authenticated) || $is_authenticated !== true) { header('HTTP/1.1 403 Forbidden'); exit("Error: Acceso no autorizado."); } $archivoSolicitado = $_GET['dfile'] ?? null; if (!$archivoSolicitado) { die("❌ Error: No se especificó ningún archivo."); } // rutas de las carpetas donde estaran los archivos $baseOrigen = __DIR__ . "/uploads"; //$rutaOrigen = $baseOrigen . basename($archivoSolicitado); // basename() limpia rutas como ../../ $rutaOrigen = $baseOrigen . $archivoSolicitado; // Definimos la carpeta temporal y la ruta completa del archivo $carpetaTemporal = __DIR__ . "/temp/"; $rutaTemporal = $carpetaTemporal . basename($archivoSolicitado); // 🔹 Lógica de creación automática de carpeta if (!file_exists($carpetaTemporal)) { // Creamos la carpeta con permisos 0755 (lectura/escritura para el servidor) // El parámetro 'true' permite creación recursiva si fuera necesario mkdir($carpetaTemporal, 0755, true); // Opcional: Crear un archivo .htaccess para proteger la carpeta temp file_put_contents($carpetaTemporal . ".htaccess", "Deny from all"); } // 3. Validación de Seguridad: ¿El archivo existe y está en la ruta permitida? if (file_exists($rutaOrigen) && is_file($rutaOrigen)) { // 4. Copiar temporalmente al directorio actual if (copy($rutaOrigen, $rutaTemporal)) { // 5. Headers para forzar descarga header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($rutaTemporal) . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($rutaTemporal)); // Limpiar buffer if (ob_get_level()) ob_end_clean(); // 6. Enviar archivo y borrar readfile($rutaTemporal); // Eliminamos la copia temporal unlink($rutaTemporal); audit('DOWNLOAD_FILE', $_GET['dfile']); exit; } else { echo "❌ Error: Permisos insuficientes para copiar el archivo en el servidor."; } } else { echo "❌ Error: El archivo no existe o el acceso está denegado."; } //echo "prueba descargador : probando $master : $rutaOrigen [temp]$rutaTemporal"; exit; } //////////////////////////////////////////////////////////// ///// //buscando la ruta real de cada carpeta $ruta = $_GET['c'] ?? ""; $uploadDir = 'uploads'.$ruta.''; $rutarealserver = realpath($uploadDir); //// /////////////////////////////////////// /// SUBIR VARIOS X AJAX ////// /////////////////////////////////////// if (isset($_GET['varios'])) { // 1. PROTECCIÓN DE SESIÓN: Si no está autenticado, el script muere aquí. if (!isset($is_authenticated) || $is_authenticated !== true) { header('HTTP/1.1 403 Forbidden'); exit("Error: Acceso no autorizado."); } if (!empty($_FILES['files']['name'][0])) { $uploadDir = 'uploads'.$ruta.''; // Crear el directorio de subida si no existe if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); } foreach ($_FILES['files']['tmp_name'] as $key => $tmpName) { $fileName = basename($_FILES['files']['name'][$key]); $targetFile = $uploadDir . $fileName; if (move_uploaded_file($tmpName, $targetFile)) { echo "Archivo subido: $fileName\n"; } else { echo "Error al subir el archivo: $fileName\n"; } } } else { echo "No se han recibido archivos."; } exit; } /////////////////////////////////////// /// SUBIR VARIOS X AJAX ////// /////////////////////////////////////// ////////////////////////////////// /// Guardar X AJAX ////// ////////////////////////////////// if (isset($_GET['guardax'])) { // PROTECCIÓN EXTRA: Si por alguna razón llegó aquí sin sesión, matamos el proceso. if (!$is_authenticated) { header('HTTP/1.1 403 Forbidden'); exit("Acceso denegado."); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { #$texto = filter_var($_POST['texto'], FILTER_SANITIZE_STRING); // Sanitizar el texto $texto = $_POST['texto']; // Sanitizar el nombre del archivo (mantiene el texto limpio de etiquetas HTML/Scripts) $filename = htmlspecialchars($_POST['miArchivo'] ?? '', ENT_QUOTES, 'UTF-8'); // Sanitizar la carpeta (mantiene el texto limpio de etiquetas HTML/Scripts) $carpeta = htmlspecialchars($_POST['miCarpeta'] ?? '', ENT_QUOTES, 'UTF-8'); if (!empty($texto)) { $archivo = "uploads$carpeta/$filename"; $fp = fopen($archivo, 'w'); fwrite($fp, $texto. ""); fclose($fp); #echo "Texto guardado correctamente en $archivo - ---- $carpeta/$filename ---- el contenido que dice : $texto "; //echo "Texto guardado correctamente."; echo $tl['msgsavefile']; } else { echo "El texto está vacío."; } } else { echo "Solicitud no valida."; } exit; } ////////////////////////////////// /// FIN Guardar X AJAX ////// ////////////////////////////////// /////// fexit (Cierre de Sesión Seguro) //////////////////////// if (isset($_GET['fexit'])) { // 1. Limpiar variables de sesión y destruirla $_SESSION = array(); session_destroy(); // 2. Preparar expiración en el pasado $past = time() - 3600; // 3. Borrado de cookies usando array de opciones (Igual que en el Login) $logoutOptions = [ 'expires' => $past, 'path' => $cookiePath, 'domain' => $cookieDomain, 'secure' => $isSecure, 'httponly' => $isHttpOnly, 'samesite' => 'Lax' ]; setcookie('loggedin', '', $logoutOptions); setcookie('Hash', '', $logoutOptions); setcookie('PTMx', '', $logoutOptions); // 4. Redirigir al archivo limpio header("Location: $scriptfile.php"); exit; } ///////EDITOR PLUS COOKIEr//////////////////////// $cokiruta=$_GET['c'] ?? ''; $cokifile=$_GET['editFile'] ?? ''; ///////EDITOR PLUS COOKIEr//////////////////////// $options_editor = [ 'expires' => $expire_time, 'path' => '/', 'secure' => $isSecure, 'httponly' => true, 'samesite' => 'Lax' ]; if (isset($_GET['oneditor'])) { setcookie('editor', 'true', $options_editor); header("Location: $scriptfile.php?editFile=$cokifile&c=$cokiruta/"); exit; } ///////EDITOR PLUS COOKIEr//////////////////////// if (isset($_GET['offeditor'])) { setcookie('editor', '', $options_editor); header("Location: $scriptfile.php?editFile=$cokifile&c=$cokiruta/"); exit; } ///////EDITOR PLUS COOKIEr//////////////////////// ////// BORRAR Configuración (CON PROTECCIÓN DE IDENTIDAD) ///////////////////////////////// if (isset($_GET['fborrarconfiguracion'])) { // Si ya envió la contraseña de confirmación vía POST if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['confirm_pass'])) { $peppered_confirm = hash_hmac("sha512", $_POST['confirm_pass'], $pepper); // Verificamos contra la clave actual en el Config if (password_verify($peppered_confirm, $configData['fpass'])) { // 1. DESTRUCCIÓN TOTAL DE SESIÓN $_SESSION = array(); // Limpiar variables // Destruir la cookie de sesión (PHPSESSID) en el navegador if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } session_destroy(); // Matar sesión en el servidor // 2. Limpiar cookies de persistencia (Zidrave Tokens) $past = time() - 3600; $logoutOptions = [ 'expires' => $past, 'path' => $cookiePath, 'domain' => $cookieDomain, 'secure' => $isSecure, 'httponly' => $isHttpOnly, 'samesite' => 'Lax' ]; setcookie('loggedin', '', $logoutOptions); setcookie('Hash', '', $logoutOptions); setcookie('PTMx', '', $logoutOptions); // 3. ELIMINACIÓN DEL ARCHIVO FÍSICO if (file_exists($configFile)) { unlink($configFile); header("Location: $scriptfile.php"); exit; } } else { echo "$seguridadcabeza

❌ Contraseña de confirmación incorrecta.

"; } } // Interfaz de confirmación echo "$seguridadcabeza"; echo "

⚠️ Confirmar Acción Crítica

Para borrar la configuración y el usuario administrador, ingrese su contraseña actual:

CANCELAR
"; exit; } /////// Guardar Configuración ///////////////////////////////// // Detectamos el parámetro GET que envía tu formulario if (isset($_GET["fconfiguracion"])) { if (!file_exists('.htaccess')) { $htaccess = << Require all denied Require all denied Require all denied EOT; @file_put_contents('.htaccess', $htaccess); } //echo "VERIFICAR GUARDANDO DATOS"; // 1. Verificamos que se haya enviado por POST para procesar datos if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Cargamos la configuración actual para no perder lo que no se cambie // $configActual = json_decode(file_get_contents($configFile), true); $configActual = cfg_load($configFile); // 2. Recoger datos del formulario $fuser = $_POST['afuser']; $mastermail = $_POST['fmail']; $fskin = $_POST['fskin']; $flanguaje = $_POST['flanguaje']; // 3. LÓGICA INTELIGENTE DE CONTRASEÑA if (!empty($_POST['afpass'])) { // Si el usuario escribió una nueva clave, la hasheamos con Pepper $peppered_pass = hash_hmac("sha512", $_POST['afpass'], $pepper); $fpass_final = password_hash($peppered_pass, PASSWORD_DEFAULT); } else { // Si el campo llegó vacío, mantenemos la contraseña que ya estaba guardada $fpass_final = $configActual['fpass']; } // 4. Actualizar Identificadores de IP (Huella Digital Secreta) $ihash_actual = $ihash; // 5. Crear el array final $config = [ 'fuser' => $fuser, 'fpass' => $fpass_final, 'fmail' => $mastermail, 'fskin' => $fskin, 'fhash' => $haship, // Hash para el auto-login (IP plana o con sal) 'flanguaje' => $flanguaje, 'ihash' => $ihash_actual // Hash para la inmunidad del unlock ]; // ========================= // 2. Procesar skin por POST // ========================= $themex = $_POST['fskin'] ?? ''; // Si no está vacío, procedemos a validar su formato if (!empty($themex)) { if (!preg_match('/^[a-zA-Z0-9_-]+$/', $themex)) { die("Nombre de theme inválido"); } } $theme_options = [ 'expires' => time() + (6 * 30 * 24 * 60 * 60), //6 meses 'path' => '/', 'secure' => $isSecure, // ✅ Usar tu variable existente 'httponly' => false, // Puede ser false porque no es sensible 'samesite' => 'Lax' ]; //echo "GUARDANDO THEME.... $hash_mini_id - $url_limpia"; //setcookie('fm_theme', $themex, $theme_options); setcookie('fm_theme_'.$hash_mini_id.'', $themex, $theme_options); // 6. Guardado Atómico con Bloqueo if (cfg_save($config, $configFile)) { echo "$seguridadcabeza $alertaini ✅ Configuración guardada correctamente. $alertafin"; } else { echo "$seguridadcabeza $alertaini ❌ Error crítico: No se pudo escribir en el archivo JSON. $alertafin"; } echo "
VOLVER AL INICIO"; exit; } } ?> File Manager V4 '; } else { // 2. Si NO existe, cargamos tu style predeterminado (File4 Style) ?>
⚠️ MODO INSEGURO : Por favor crea una Contraseña en: ⚙️ Configurar
')) { echo "
🚀 Versión nueva $version_remota disponible (tienes $fversion instalada) — Actualizar ahora
"; } } ?> ". htmlspecialchars(basename($_FILES['fileToUpload']['name'])). " ha sido subido exitosamente. $alertafin "; } else { echo " $alertaini⚠️Error al subir el archivo. $alertafin"; } } /////// ACTUALIZAR SISTEMA (CON PROTECCIÓN DE IDENTIDAD Y PARCHEO DINÁMICO) ///////////////////////////////// if (isset($_GET['fupdate'])) { // 1. Interfaz de Confirmación (Prevención CSRF) if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['confirm_update_pass'])) { echo "$seguridadcabeza"; echo "

🚀 Actualizar Sistema ($fversion)

Esta acción descargará la última versión desde GitHub y sobrescribirá el archivo actual.

⚠️ Nota: El sistema parchará automáticamente el nuevo archivo para mantener tus archivos de Configuración y Seguridad actuales.

CANCELAR
"; exit; } // 2. Validación de Identidad $peppered_confirm = hash_hmac("sha512", $_POST['confirm_update_pass'], $pepper); if (!password_verify($peppered_confirm, $configData['fpass'])) { die("$seguridadcabeza

❌ Contraseña incorrecta. Operación cancelada por seguridad.

"); } //publicKeyBase64 ya esta definido al inicio del script // 3. Proceso de Descarga $furl = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/file4.php'; $furlSig = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/file4.php.sig'; // A. Verificar si la extensión necesaria está instalada if (!extension_loaded('sodium')) { die("$seguridadcabeza

⚠️ Falta instalar la extensión 'sodium'

Para realizar actualizaciones seguras, este servidor requiere la extensión PHP Sodium.

Por favor, actívala desde el panel de control de tu hosting (sección de Extensiones PHP) o contacta a tu soporte técnico.

VOLVER
"); } // A. Descargar contenido y firma $fcontenido = @file_get_contents($furl); $firmaBinaria = @file_get_contents($furlSig); // B. Verificación Ed25519 // 1. Decodificar la clave Base64 a binario (esto la convierte a los 32 bytes requeridos) $publicKeyBinaria = base64_decode($publicKeyBase64); // 2. Decodificar la firma descargada de Base64 a binario $firmaBinariaDecodificada = base64_decode($firmaBinaria); // Validación de seguridad para la firma if (strlen($firmaBinariaDecodificada) !== 64) { die(" $alertaini 🛑 Error: La firma (.sig) debe ser de 64 bytes. Longitud recibida: " . strlen($firmaBinariaDecodificada) . " $alertafin "); } // 3. Verificación try { // IMPORTANTE: Se usa $publicKeyBinaria (binario), no $publicKeyBase64 (texto) $verificado = sodium_crypto_sign_verify_detached($firmaBinariaDecodificada, $fcontenido, $publicKeyBinaria); } catch (Exception $e) { die(" $alertaini 🛑 Error en la verificación: " . $e->getMessage() . " $alertafin "); } if (!$verificado) { die(" $alertaini 🛑 ERROR: Firma inválida. El archivo fue modificado o la firma no corresponde. $alertafin "); } $furlicon = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/favicon.ico'; $furlidioma = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/en.json'; $furlidioma2 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/de.json'; $furlskin1 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_dark-zidrave.css'; $furlskin2 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_original.css'; $furlskin3 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_taringa.css'; $furlskin4 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_dark-red.css'; $furlskin5 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_dark-leonardo.css'; $furlskin6 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_blue.css'; $furlskin7 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_identi.css'; $furlskin8 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_invision.css'; $furlskin9 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_phpbb.css'; $furlskin10 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_phpnuke.css'; $furlskin11 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_steam.css'; $furlskin12 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_vbulletin.css'; $furlskin13 = 'https://raw.githubusercontent.com/zidrave/filemanager_1filephp/main/fmstyle_whatsapp.css'; $rutaArchivoLocal = isset($_GET['updatefile']) ? $_GET['updatefile'] . ".php" : "$scriptfile.php"; //$fcontenido = @file_get_contents($furl); //aun no escribire el script para otras verificaciones $fcontenidoicon = @file_get_contents($furlicon); $fcontenidolang = @file_get_contents($furlidioma); $fcontenidolang2 = @file_get_contents($furlidioma2); $fcontenidoskin1 = @file_get_contents($furlskin1); $fcontenidoskin2 = @file_get_contents($furlskin2); $fcontenidoskin3 = @file_get_contents($furlskin3); $fcontenidoskin4 = @file_get_contents($furlskin4); $fcontenidoskin5 = @file_get_contents($furlskin5); $fcontenidoskin6 = @file_get_contents($furlskin6); $fcontenidoskin7 = @file_get_contents($furlskin7); $fcontenidoskin8 = @file_get_contents($furlskin8); $fcontenidoskin9 = @file_get_contents($furlskin9); $fcontenidoskin10 = @file_get_contents($furlskin10); $fcontenidoskin11 = @file_get_contents($furlskin11); $fcontenidoskin12 = @file_get_contents($furlskin12); $fcontenidoskin13 = @file_get_contents($furlskin13); if ($fcontenido === FALSE) { die(" $alertaini ⚠️ No se pudo descargar el archivo desde GitHub. Revisa la conexión del servidor. $alertafin "); } // --- 4. PARCHEO DINÁMICO: conserva TUS valores actuales, no el placeholder del repo --- // Escapa un valor para insertarlo de forma segura como literal PHP, // y además escapa $ y \ para que preg_replace no los interprete como backreferences. function construir_reemplazo_php(string $nombreVar, string $valorActual): string { $valorEscapadoPhp = addcslashes($valorActual, "\\'"); $lineaPhp = '$' . $nombreVar . " = '" . $valorEscapadoPhp . "';"; return str_replace(['\\', '$'], ['\\\\', '\$'], $lineaPhp); } $patrones = [ '/\$tokenplus\s*=\s*(["\']).*?\1;/' => construir_reemplazo_php('tokenplus', $tokenplus), '/\$pepper\s*=\s*(["\']).*?\1;/' => construir_reemplazo_php('pepper', $pepper), '/\$configFile\s*=\s*(["\']).*?\1;/' => construir_reemplazo_php('configFile', $configFile), ]; $fcontenido = preg_replace(array_keys($patrones), array_values($patrones), $fcontenido); // Verificación: confirma que el parcheo realmente aplicó tus valores actuales if (strpos($fcontenido, addcslashes($tokenplus, "\\'")) === false || strpos($fcontenido, addcslashes($pepper, "\\'")) === false || strpos($fcontenido, addcslashes($configFile, "\\'")) === false) { die("$alertaini ⚠️ El parcheo de configuración local falló (posible cambio de formato en el script fuente). Actualización cancelada por seguridad — tus credenciales NO se sobrescribieron. $alertafin"); } // 5. Reemplazo de Archivos en Disco if (file_put_contents($rutaArchivoLocal, $fcontenido) === FALSE) { die(" $alertaini ⚠️ Error crítico: No se pudo escribir en $rutaArchivoLocal. Verifica permisos de escritura. $alertafin "); } if ($fcontenidoicon) file_put_contents("favicon.ico", $fcontenidoicon); if ($fcontenidolang) file_put_contents("en.json", $fcontenidolang); if ($fcontenidolang2) file_put_contents("de.json", $fcontenidolang2); if ($fcontenidoskin1) file_put_contents("fmstyle_dark-zidrave.css", $fcontenidoskin1); if ($fcontenidoskin2) file_put_contents("fmstyle_original.css", $fcontenidoskin2); if ($fcontenidoskin3) file_put_contents("fmstyle_taringa.css", $fcontenidoskin3); if ($fcontenidoskin4) file_put_contents("fmstyle_dark-red.css", $fcontenidoskin4); if ($fcontenidoskin5) file_put_contents("fmstyle_dark-leonardo.css", $fcontenidoskin5); if ($fcontenidoskin6) file_put_contents("fmstyle_blue.css", $fcontenidoskin6); if ($fcontenidoskin7) file_put_contents("fmstyle_identi.css", $fcontenidoskin7); if ($fcontenidoskin8) file_put_contents("fmstyle_invision.css", $fcontenidoskin8); if ($fcontenidoskin9) file_put_contents("fmstyle_phpbb.css", $fcontenidoskin9); if ($fcontenidoskin10) file_put_contents("fmstyle_phpnuke.css", $fcontenidoskin10); if ($fcontenidoskin11) file_put_contents("fmstyle_steam.css", $fcontenidoskin11); if ($fcontenidoskin12) file_put_contents("fmstyle_vbulletin.css", $fcontenidoskin12); if ($fcontenidoskin13) file_put_contents("fmstyle_whatsapp.css", $fcontenidoskin13); echo " $alertaini ⚠️ " . $tl['okupdate'] . " $alertafin"; echo " " . $tl['reload'] . " "; audit('SYSTEM_UPDATE', 'Version: ' . $fversion); exit; } // Eliminar archivo (Versión con Protección de Configuración) if (isset($_GET['deleteFile'])) { if (!isset($is_authenticated) || $is_authenticated !== true) { header('HTTP/1.1 403 Forbidden'); exit("Error: Acceso no autorizado."); } audit('DELETE_FILE', $_GET['deleteFile'] ?? ''); //registrar acciones $fileToDelete = $_GET['deleteFile']; $archivoname = basename($fileToDelete); $archivonameSafe = htmlspecialchars($archivoname, ENT_QUOTES, 'UTF-8'); // --- PROTECCIÓN --- // 1. No se puede borrar el archivo definido en $configFile // 2. No se puede borrar el propio script ejecutable (file4.php) if ($archivoname === $configFile || $archivoname === "$scriptfile.php") { $mensajeAlerta = "❌ ERROR: El archivo " . htmlspecialchars($archivonameSafe) . " es un archivo de sistema."; $colorFondo = '#000000'; } else { // Proceder con el borrado si no es un archivo protegido // Variables para controlar el mensaje y el color de fondo de la alerta $mensajeAlerta = ''; $colorFondo = '#ff4d4d'; // Rojo por defecto para errores o avisos if (file_exists($fileToDelete)) { if (unlink($fileToDelete)) { // Éxito al eliminar $mensajeAlerta = "⚠️ ¡Archivo " . htmlspecialchars($archivonameSafe) . " Eliminado!"; //$colorFondo = '#28a745'; // Verde para éxito (opcional) o déjalo en #ff4d4d si prefieres rojo } else { // Error al intentar eliminar $mensajeAlerta = "❌ Error al intentar eliminar el archivo."; } } else { // Archivo no encontrado $mensajeAlerta = "⚠️ El archivo " . htmlspecialchars($archivonameSafe) . " no fue encontrado."; $colorFondo = '#000000'; } } } // Crear carpeta if (isset($_POST['createFolder'])) { $newFolder = $uploadDir . $_POST['createFolder']; if (!is_dir($newFolder)) { mkdir($newFolder, 0755); echo " $alertaini ⚠️ Carpeta creada. $alertafin "; } else { echo " $alertaini ⚠️ La carpeta no se creo, por que ya existe. $alertafin "; } } // Eliminar carpeta /////////////////////////////////////////////////////////////////////////////////////////////////////BORRAR FOLDER if (isset($_POST['deleteFolder']) || isset($_GET['deleteFolder'])) { $elfolder = $_POST['deleteFolder'] ?? $_GET['deleteFolder']; $folderToDelete = $uploadDir . $elfolder; if (is_dir($folderToDelete)) { rmdir($folderToDelete); echo "$alertaini ⚠️Carpeta eliminada solo si estaba vacia. $alertafin"; } else { echo "$alertaini ⚠️ Carpeta no encontrada. $alertafin"; } audit('DELETE_FOLDER', $_POST['deleteFolder'] ?? $_GET['deleteFolder'] ?? ''); } // Editar o crear archivo if (isset($_GET['editFile'])) { $fileToEdit = $_GET['editFile'] ?? ''; $fileToEdit = "uploads$carpetaz/$fileToEdit"; if (file_exists($fileToEdit)) { $fileContent = file_get_contents($fileToEdit); } else { // Si el archivo no existe, crearlo con contenido vacío file_put_contents($fileToEdit, ''); $fileContent = ''; } audit('EDIT_FILE', $_GET['editFile'] ?? ''); } // Guardar archivo editado if (isset($_POST['saveFile'])) { $fileToSave = $_POST['fileName']; $fileToSave = "uploads$carpetaz/$fileToSave"; $c = $_POST['c']; $cSafe = htmlspecialchars($c, ENT_QUOTES, 'UTF-8'); $newContent = $_POST['fileContent']; file_put_contents($fileToSave, $newContent); echo "$alertaini ⚠️ Archivo Guardado. $alertafin"; $elarchivo = $_GET['editFile'] ?? ''; $elarchivoSafe = htmlspecialchars($elarchivo, ENT_QUOTES, 'UTF-8'); echo " RECARGAR "; exit; } // Renombrar archivo if (isset($_POST['renameFile'])) { audit('RENAME_FILE', $_POST['oldName'] . ' -> ' . $_POST['newName']); $oldName = $uploadDir . $_POST['oldName']; $newName = $uploadDir . $_POST['newName']; $oldNameBase = basename($_POST['oldName']); // --- PROTECCIÓN: no se puede renombrar el archivo de configuración --- if ($oldNameBase === $configFile) { $mensajeAlerta = "❌ No se puede tocar archivo de sistema."; $colorFondo = '#000000'; } elseif (file_exists($oldName)) { if (rename($oldName, $newName)) { $nombreLimpio = basename($newName); $mensajeAlerta = "⚠️ Archivo renombrado a " . htmlspecialchars($nombreLimpio) . " "; $colorFondo = '#000000'; } else { $mensajeAlerta = "⚠️ Error al renombrar el archivo."; $colorFondo = '#000000'; } } else { $mensajeAlerta = "⚠️ Archivo no encontrado."; $colorFondo = '#000000'; } } // copiar archivo if (isset($_POST['copyFile'])) { $oldName = $uploadDir . $_POST['oldName']; $newName = $uploadDir . $_POST['newName']; audit('COPY_FILE', $_POST['oldName'] . ' -> ' . $_POST['newName']); if (file_exists($oldName)) { if (copy($oldName, $newName)) { $nombreLimpio = basename($newName); $mensajeAlerta = "⚠️ Archivo Copiado " . htmlspecialchars($nombreLimpio) . " "; $colorFondo = '#000000'; } else { $mensajeAlerta = "⚠️ Error al copiar el archivo."; $colorFondo = '#000000'; } } else { $mensajeAlerta = "⚠️ Archivo no encontrado."; $colorFondo = '#000000'; } } ////////////////// Comprimir archivo o carpeta 🚀 🚀🚀🚀🚀🚀🚀🚀 if (isset($_POST['compressFile'])) { $namefilec = $_POST['archivoacomprimir'] ?? ''; $namefilecSafe = htmlspecialchars($namefilec, ENT_QUOTES, 'UTF-8'); $namefilepass = $_POST['password'] ?? ''; $descripcion = $_POST['descripcion'] ?? ''; $nombreZipa = isset($_POST['archivoacomprimir']) ? $_POST['archivoacomprimir'] . '.zip' : 'archivo_protegido.zip'; $nombreZip = "uploads$getruta$nombreZipa"; $namefilepass = isset($_POST['password']) ? $_POST['password'] : ''; $descripcion = isset($_POST['descripcion']) ? $_POST['descripcion'] : ''; // Instanciar ZipArchive $zip = new ZipArchive(); // Función para comprimir carpeta con contraseña function comprimirCarpetaConContrasena($origen, $destino, $excluir = [], $contrasena) { $zip = new ZipArchive(); if ($zip->open($destino, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { die("No se pudo crear el archivo ZIP.\n"); } $archivos = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($origen, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST ); foreach ($archivos as $archivo) { $rutaRelativa = str_replace($origen . '/', '', $archivo->getPathname()); $excluirArchivo = false; foreach ($excluir as $itemExcluido) { if (strpos($rutaRelativa, $itemExcluido) === 0) { $excluirArchivo = true; break; } } if (!$excluirArchivo) { if ($archivo->isDir()) { $zip->addEmptyDir($rutaRelativa); } else { $zip->addFile($archivo->getPathname(), $rutaRelativa); if ($contrasena) { $zip->setEncryptionName($rutaRelativa, ZipArchive::EM_AES_256, $contrasena); } } } } $zip->close(); if (!file_exists($destino)) { // echo "$alertaini ⚠️Error al comprimir la carpeta con contraseña.\n $alertafin"; $mensajeAlerta = " ⚠️ ⚠️Error al comprimir la carpeta con contraseña. "; $colorFondo = '#000000'; } else { #echo "$alertaini ⚠️ Carpeta comprimida y con Password en:\n $destino\n $alertafin "; } } // Verificar si se pasa un archivo o carpeta mediante POST if (isset($_POST['archivoacomprimir'])) { $ruta = "uploads$getruta" . $_POST['archivoacomprimir']; if (is_file($ruta)) { // Añadir un único archivo $zip->open($nombreZip, ZipArchive::CREATE | ZipArchive::OVERWRITE); $zip->addFile($ruta, basename($ruta)); if (!empty($namefilepass)) { $zip->setEncryptionName(basename($ruta), ZipArchive::EM_AES_256, $namefilepass); } $zip->close(); $mensajeAlerta = "⚠️ Archivo Comprimido a $namefilecSafe.zip "; $colorFondo = '#000000'; audit('COMPRESS_FILE', $namefilecSafe . '.zip'); } elseif (is_dir($ruta)) { // Añadir una carpeta completa comprimirCarpetaConContrasena($ruta, $nombreZip, [], $namefilepass); // echo "$alertaini ⚠️ La carpeta $namefilecSafe.zip se ha creado correctamente. $alertafin"; $mensajeAlerta = "⚠️ La carpeta se comprimio en: $namefilecSafe.zip se ha creado correctamente. "; $colorFondo = '#000000'; } else { $rutaSafe = htmlspecialchars($ruta, ENT_QUOTES, 'UTF-8'); //echo " $alertaini ⚠️ La ruta especificada no es válida $rutaSafe . $alertafin "; //exit; $mensajeAlerta = " ⚠️ La ruta especificada no es válida $rutaSafe . "; $colorFondo = '#000000'; } } else { //echo "No se especificó ningún archivo o carpeta."; //exit; $mensajeAlerta = " ⚠️ No se especificó ningún archivo o carpeta. "; $colorFondo = '#000000'; } // Agregar un comentario al archivo ZIP if (!empty($descripcion)) { $zip = new ZipArchive(); if ($zip->open($nombreZip) === TRUE) { $zip->setArchiveComment($descripcion); $zip->close(); } else { echo " $alertaini ⚠️ No se pudo abrir el archivo ZIP para agregar el comentario. $alertafin "; } } // echo "RECARGAR "; // exit; } ////////////////// Comprimir archivo o carpeta 🚀 🚀🚀🚀🚀🚀🚀🚀 // Listar archivos y carpetas $items = scandir($uploadDir); ?>

🌀 File Manager - 🏠 ↩️ 📝 🗂️ ⚙️ 🔄

;">
: / " . $parteSafe . " / "; } } ?>

Arrastra y suelta tus archivos aquí

O haz clic para seleccionarlos

0%
/" class="azulin2"> Cerrar

" class="azulin2"> Editor Plus " class="snaranja"> Editor Plus

📝 : [Editor Plus]

1
/" class="azulin2"> /" class="azulin2">

📝 : [Editor Simple]


/" class="azulin2"> /" class="azulin2">

📝 Editando:


" class="azulin2">Descartar Cambios /" class="azulin2"> Cerrar

🔄 :

&updatefile=" method="post"> (Version Actual )
.





⚙️

.

">

">









🗂️

:



📝

:



()

: " >



📚 ZIP ()

" method="post"> :
" required class="formtext" readonly> : " > '' `, _,--....___ | https://github.com/zidrave/ `/ '''' ................................................................................... 2024 " >


🖊️ ".$tl['information']." "; echo "

▶️ ".$tl['fullpath'].":

"; echo "

▶️ ".$tl['filesize'].": " . xformatSize2($sizer) . "

"; echo "

▶️ ".$tl['creationdate'].": " . date('d-m-Y H:i:s', $creationTimee) . "

"; echo "

▶️ ".$tl['lastaccessdate'].": " . date('d-m-Y H:i:s', $lastAccessTimee) . "

"; echo "

▶️ ".$tl['lastmodifieddate'].": " . date('d-m-Y H:i:s', $lastModificationTimee) . "

"; echo "

▶️ ".$tl['permissions'].": " . $permissions . "

"; echo "

▶️ ".$tl['owner'].": " . $ownerInfo['name'] . " (UID: $ownerID)

"; echo "

▶️ ".$tl['group'].": " . $groupInfo['name'] . " (GID: $groupID)

"; echo "

▶️ ".$tl['mimetype'].": " . $mimeType . "

"; echo "

▶️ ".$tl['currentservertime'].": " . $serverTime . "

"; # echo "

▶️ Tipo de archivo: " . $fileType . "

"; echo "

▶️ Hash MD5: " . $md5Hash . "

"; ?>

🖊️

" method="post"> " readonly required class="formtext"> " required class="formtext" style='width: 250px;'> " >

🖊️

" method="post"> " readonly required class="formtext"> " required class="formtext" style='width: 250px;'> " >

"; } else { # echo "La extensión del archivo no es .jpg, .bmp, .tiff o .gif"; } #echo "
Eliminar"; ?>


&c=" class='naranja'> &c=" class='verde'> " class='azulin'>


$master / [".$tl['exit']."]"; } //preparando parceo de ruta real del server////////////////// // 1. Definiciones de ruta absoluta (Mantenemos la lógica de base) $baseReal = realpath(__DIR__ . "/uploads"); $rutaExplorada = realpath($rutarealserver); // Preparamos los arrays $arrBase = explode(DIRECTORY_SEPARATOR, trim($baseReal, DIRECTORY_SEPARATOR)); $arrExplo = explode(DIRECTORY_SEPARATOR, trim($rutaExplorada, DIRECTORY_SEPARATOR)); // AGREGAMOS EL ELEMENTO VACÍO AL INICIO para representar la raíz "/" array_unshift($arrExplo, ""); ?>
: $nombre) { // Reconstruimos la ruta física para este punto // Si el nombre es vacío, es la raíz "/" if ($nombre === "") { $rutaDestino = DIRECTORY_SEPARATOR; } else { // Quitamos el primer elemento vacío para reconstruir la ruta de carpetas reales $carpetasReales = array_filter(array_slice($arrExplo, 0, $indice + 1)); $rutaDestino = DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $carpetasReales); } $arrDestino = explode(DIRECTORY_SEPARATOR, trim($rutaDestino, DIRECTORY_SEPARATOR)); // --- CÁLCULO DE RELATIVIDAD --- $maxComun = 0; $minLen = min(count($arrBase), count($arrDestino)); for ($i = 0; $i < $minLen; $i++) { if (isset($arrBase[$i], $arrDestino[$i]) && $arrBase[$i] === $arrDestino[$i]) { $maxComun = $i + 1; } else { break; } } $subidas = count($arrBase) - $maxComun; $relativo = ""; for ($i = 0; $i < $subidas; $i++) { $relativo .= "../"; } $bajadas = array_slice($arrDestino, $maxComun); if (!empty($bajadas)) { $relativo .= implode("/", $bajadas); } // Normalización de Trail Slash y Prefijo $enlaceLimpio = trim($relativo, "/"); if ($enlaceLimpio !== "") { $enlaceLimpio = "/" . $enlaceLimpio . "/"; } else { $enlaceLimpio = "/"; } // --- DIBUJAR LINK --- // Si el nombre está vacío, mostramos el símbolo de Raíz "/" $label = ($nombre === "") ? " / " : $nombre; $labelSafe = htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); echo "📂$labelSafe "; if ($indice < $totalPartes - 1) { echo " ➡︎ "; } } ///fin de parceador //// ?>

_
" . date("H:i", filemtime($filePath)) . ""; #///agregando iconos personalzados //// if (is_dir($uploadDir . $item)) { $fileType = 'folder'; $icon = '📂'; $totalCarpetas++; } else { $totalArchivos++; $totalPesoCarpeta += filesize($uploadDir . '/' . $item); //solo mediremos el peso de archivos $fileType = 'file'; $fileSize = filesize($filePath); // Asignar iconos basados en la extensión del archivo $extension = pathinfo($item, PATHINFO_EXTENSION); switch (strtolower($extension)) { case 'jpg': case 'jpeg': case 'webp': case 'jfif': case 'bmp': case 'png': case 'gif': // $icon = '🖼️'; // Icono para imágenes break; case 'php': case 'exe': case 'py': case 'sh': $icon = '⚙️'; // Icono para ejecutables break; case 'txt': case 'json': case 'rtf': case 'ini': case 'js': case 'htm': case 'html': $icon = '📝'; // Icono para archivos de texto break; case 'pdf': $icon = '📕'; // Icono para archivos PDF break; case 'doc': case 'docx': $icon = '📘'; // Icono para archivos PDF break; case 'zip': case 'rar': $icon = '📚'; // Icono para archivos comprimidos break; case 'mp3': case 'wav': $icon = '🎵'; // Icono para archivos de audio break; case 'mp4': case 'mkv': $icon = '🎥'; // Icono para archivos de video break; default: $icon = '📜'; // Icono genérico para otros archivos break; } } if (is_dir($uploadDir . $item)) { // estos son carpetas echo "
◽ $icon $itemSafe
".$tl['folder']."
$fileModTime
$filePerms
$fileOwner
"; } else { $fileSize = filesize($uploadDir . $item); //Estos son archivos $itemr = $item; if (strlen($itemr) > 30) { $itemr = substr($itemr, -30); $itemr = "➰".$itemr; } $itemr = htmlspecialchars($itemr, ENT_QUOTES, 'UTF-8'); echo "
"; // ARCHIVOS aplican lógica especial para imagenes if (in_array($extension, $imageExts)) { echo "
◽ $icon $itemr ➡︎ 🔗
"; } else { echo "
◽ $icon $itemr
"; } echo "
" . formatSize($fileSize) . "
$fileModTime
$filePerms
$fileOwner
"; //zona de confirmaciones para eliminacion echo "

¿ ".$tl['qdelete']." ?


$itemSafe


".$tl['deletenow']." ".$tl['cancel']."
"; echo "
"; } } } echo "
".$tl['folder']."
Null
Null
".$tl['system']."
"; ?>

◽ 📁 ◽ 📁 (s) ◽ 📄 (s)

1024 && $i < count($units) - 1; $i++) { $bytes /= 1024; } return round($bytes, 2) . ' ' . $units[$i]; } // Obtener información del disco $diskTotal = disk_total_space("/"); $diskFree = disk_free_space("/"); $diskUsed = $diskTotal - $diskFree; // Obtener información de memoria $memInfo = file_get_contents('/proc/meminfo'); preg_match('/MemTotal:\s+(\d+) kB/', $memInfo, $matches); $memTotal = $matches[1] * 1024; preg_match('/MemFree:\s+(\d+) kB/', $memInfo, $matches); $memFree = $matches[1] * 1024; $memUsed = $memTotal - $memFree; // Obtener carga del procesador y calcular porcentaje estimado function get_cpu_cores() { $cores = 1; if (stristr(PHP_OS, 'WIN')) { // Windows $process = popen('wmic cpu get NumberOfLogicalProcessors', 'rb'); if (false !== $process) { fgets($process); $cores = intval(fgets($process)); pclose($process); } } else { // Linux / BSD / MacOS if (is_readable('/proc/cpuinfo')) { $cpuinfo = file_get_contents('/proc/cpuinfo'); preg_match_all('/^processor/m', $cpuinfo, $matches); $cores = count($matches[0]); } elseif (($process = popen('sysctl -n hw.ncpu', 'rb')) !== false) { // MacOS / BSD $cores = intval(fgets($process)); pclose($process); } else { // Fallback para otros Linux $cores = intval(shell_exec('nproc')) ?: 1; } } return $cores > 0 ? $cores : 1; } // 1. Obtener carga y núcleos $numCores = get_cpu_cores(); $loadAvg = sys_getloadavg(); $cpuLoad = $loadAvg[0]; // Carga del último minuto // 2. Calcular porcentaje real basado en núcleos // Un load de 1.0 en 4 núcleos es 25%. Un load de 4.0 en 4 núcleos es 100%. $cpuUsagePercent = round(($cpuLoad / $numCores) * 100, 2); $cpuUsage = $cpuUsagePercent . '%'; // Obtener temperatura del núcleo (si disponible) $coreTemp = 'N/A'; if (file_exists('/sys/class/thermal/thermal_zone0/temp')) { $coreTemp = round(file_get_contents('/sys/class/thermal/thermal_zone0/temp') / 1000, 1) . '°C'; } // Obtener información del sistema operativo $os = php_uname('s') . ' ' . php_uname('r'); ?>
🖥️ ".$tl['systeminformation']." \n"; echo " \n"; echo " ✅ ".$tl['usedspace'].": " . formatSize($diskUsed) . "
\n"; echo " ✅ ".$tl['availablespace'].": " . formatSize($diskFree) . "
\n"; echo " ✅ ".$tl['usedmemory'].": " . formatSize($memUsed) . "
\n"; echo " ✅ ".$tl['totalmemory'].": " . formatSize($memTotal) . "
\n"; #echo "
  • Uso del procesador: " . $cpuLoad . " (carga promedio)
    \n"; //echo " ✅ ".$tl['processorusage'].": " . $cpuLoad . " (".$tl['averageload'].") - " . $cpuUsage . "
    \n"; echo " ✅ " . ($tl['processorusage'] ?? 'Carga CPU') . ": " . $cpuLoad . " (" . ($tl['averageload'] ?? 'Promedio') . ") - " . $cpuUsage . " (" . $numCores . " Cores)
    \n"; echo " ✅ ".$tl['coretemperature'].": " . $coreTemp . "
    \n"; //echo " ⏱️ ".$tl['uptime'].": " . getUptime() . "
    \n"; echo " ⏱️ Online: " . getUptime() . "
    \n"; echo " ✴️ ".$tl['operatingsystem'].": " . $os . "
  • \n"; echo "
    \n"; ?>

    🗂️ FILE MANAGER | Full Version http://zidrave.net - Email: developer@zidrave.net

    [Español | Ingles | Aleman]