Este script funciona como un mini explorador y editor web de archivos dentro del servidor.
Permite:
- Navegar carpetas desde una ruta base segura.
- Listar carpetas y archivos.
- Abrir archivos por URL directa.
- Editar contenido de un archivo desde un textarea.
- Reemplazar un archivo seleccionado mediante upload.
- Crear respaldo automatico antes de modificar.
Flujo principal:
- Detecta rutas base del servidor y la ruta actual del script.
- Lee parametros GET para decidir carpeta actual y archivo a editar.
- Valida seguridad de rutas para evitar salir de la base.
- Si llega POST, ejecuta accion:
- guardar_contenido
- reemplazar_archivo
- Lista carpeta actual separando carpetas y archivos.
- Renderiza HTML con:
- breadcrumb
- enlaces de navegacion
- listado
- editor (si hay archivo seleccionado)
Variables clave:
- $directorioActual: ruta fisica del script.
- $documentRoot: raiz web reportada por el servidor.
- $documentRootReal: version normalizada de DOCUMENT_ROOT.
- $directorioBase: limite superior permitido de navegacion.
Regla de seguridad:
- Si DOCUMENT_ROOT no es valido o no contiene la ruta del script, se usa la carpeta actual como base segura.
Variables:
- $rutaRelativaInicial: ruta relativa de la carpeta del script dentro de la base.
- $mensaje: texto de feedback para la vista.
- $tipoMensaje: ok o error.
Parametro:
- dir: carpeta destino relativa.
Normalizacion:
- Reemplazo de backslash por slash.
- Limpieza de puntos y barras redundantes.
Variable:
- $directorioObjetivo: carpeta efectiva a listar.
Validaciones:
- realpath debe resolver correctamente.
- Debe ser directorio real.
- Debe permanecer dentro de $directorioBase.
Si falla:
- Vuelve a carpeta del script.
- Genera mensaje de error.
Variable:
- $rutaRelativaActual: usada para links, formularios y breadcrumb.
Parametros:
- GET edit: archivo seleccionado en el listado.
- POST archivo_objetivo: archivo mantenido en formularios.
Validaciones:
- Debe existir.
- Debe ser archivo.
- Debe estar dentro de la base permitida.
Acciones disponibles:
- guardar_contenido
- reemplazar_archivo
Pasos comunes:
- Verificar permiso de escritura.
- Crear respaldo .bak con timestamp.
Ruta guardar_contenido:
- Escribe texto con file_put_contents.
Ruta reemplazar_archivo:
- Lee archivo subido en $_FILES.
- Valida estado de upload.
- Sustituye con move_uploaded_file.
Proceso:
- Intenta scandir sobre carpeta objetivo.
- Si falla, fallback a carpeta del script.
- Si vuelve a fallar, usa arreglo vacio y muestra error.
- Separa resultados en:
- $carpetas
- $archivos
- Ordena alfabeticamente con sort.
Elementos:
- Subir nivel: calcula ruta padre con explode, array_pop, implode.
- Breadcrumb: crea nodos acumulados para navegar por cada nivel.
- Atras y Adelante: usa history.back y history.forward del navegador.
Variables:
- $urlBaseServidor: esquema + host.
- $urlCarpetaActual: url publica de la carpeta actual.
Se usa:
- rawurlencode para caracteres especiales.
- reemplazo de %2F por / para mantener slashes legibles.
-
Resolver una ruta Significa convertir una ruta "relativa o ambigua" en una ruta real completa del sistema. Ejemplo: ./uploads/../users pasa a /var/www/server/miserver/users.
-
Normalizar una ruta Significa dejarla en un formato consistente para compararla o usarla sin errores. Ejemplo: cambiar \ por /, quitar barras dobles y limpiar extremos.
-
Ruta absoluta Es la ruta completa desde la raiz del sistema. Ejemplo Linux: /var/www/server/miserver/uploads.
-
Ruta relativa Es una ruta calculada desde una base. Ejemplo: si la base es /var/www/server y estas en /var/www/server/miserver/uploads, la ruta relativa es miserver/uploads.
-
Ruta base Es el limite superior permitido para navegar. El script no deberia salir de esta zona.
-
Directorio objetivo Es la carpeta que el script intenta listar en ese momento. Cambia cuando haces click en Entrar o Subir nivel.
-
Validar una ruta Es verificar que exista, que sea carpeta/archivo correcto y que no salga de la base.
-
Path traversal Tecnica para intentar salir de la carpeta permitida usando ../ Ejemplo malicioso: ?dir=../../etc. El script lo bloquea validando realpath y prefijo de base.
-
Fallback Es un "plan B" cuando algo falla. Ejemplo: si scandir falla en carpeta objetivo, intentar con carpeta del script.
-
Sanitizar entrada Limpiar datos que vienen de usuario (GET, POST, FILES) antes de usarlos.
-
Escapar salida Convertir caracteres especiales para que no se ejecuten como HTML/JS. Se hace con htmlspecialchars para prevenir XSS.
-
Query string Parte de la URL despues de ? Ejemplo: ?dir=miserver/uploads&edit=index.php
-
GET Metodo para enviar datos por URL (visible en la barra del navegador).
-
POST Metodo para enviar datos por formulario (no visible en URL).
-
Upload Subida de archivo desde el navegador al servidor.
-
Respaldo o backup Copia de seguridad de un archivo antes de modificarlo. Ejemplo: index.php.bak.20260411_101530
-
Timestamp Marca de fecha y hora usada para nombres unicos.
-
Renderizar HTML Construir y enviar el contenido visual final que ve el navegador.
-
Breadcrumb Ruta navegable por niveles, por ejemplo: server / miserver / uploads.
-
Superglobales de PHP Variables especiales disponibles siempre, como $_GET, $_POST, $_SERVER, $_FILES.
-
if Evalua una condicion y ejecuta un bloque si es verdadera. Ejemplo: if ($ruta !== '') { ... }
-
else Se ejecuta cuando la condicion del if no se cumple. Ejemplo: if ($ok) { ... } else { $mensaje = 'error'; }
-
foreach Recorre elementos de un arreglo sin usar indices manuales. Ejemplo: foreach ($archivos as $archivo) { ... }
-
continue Salta al siguiente ciclo del foreach. Ejemplo: si el item es . o .., se omite con continue.
-
=== Comparacion estricta: mismo valor y mismo tipo. Ejemplo: $valor === false
-
!== Diferente estricto: cambia valor o tipo. Ejemplo: $ruta !== ''
-
?: Operador ternario para asignaciones compactas. Sintaxis: condicion ? valor_si_true : valor_si_false Ejemplo: $esquema = $esHttps ? 'https' : 'http';
-
. Concatenacion de cadenas. Ejemplo: $url = $base . '/' . $archivo;
-
array() Crea un arreglo. Ejemplo: $carpetas = array();
-
count($arr) Cuenta elementos del arreglo. Ejemplo: if (count($carpetas) === 0) { ... }
-
sort($arr) Ordena el arreglo ascendente (alfabetico para strings). Ejemplo: sort($archivos);
-
explode('/', $texto) Divide un string por separador y devuelve arreglo. Ejemplo: explode('/', 'a/b/c') => ['a','b','c']
-
implode('/', $arr) Une arreglo en un string usando separador. Ejemplo: implode('/', ['a','b']) => 'a/b'
-
array_pop($arr) Elimina y devuelve el ultimo elemento. Uso en el script: subir un nivel de carpeta quitando el ultimo segmento.
-
trim($txt) Quita espacios al inicio y fin. Ejemplo: trim($_GET['dir'])
-
ltrim($txt, $chars) Quita caracteres del inicio. Ejemplo: ltrim($ruta, '/\')
-
strlen($txt) Longitud del string. Uso en el script: calcular desplazamiento para rutas relativas.
-
substr($txt, $inicio) Extrae una parte del string. Ejemplo: substr($rutaAbs, strlen($base))
-
str_replace($buscar, $reemplazo, $txt) Reemplaza texto literal. Ejemplo: str_replace('\', '/', $ruta)
-
strpos($txt, $buscar) Busca posicion (sensible a mayusculas). Ejemplo: strpos($directorioActual, $documentRootReal) !== 0
-
stripos($txt, $buscar) Igual a strpos, pero ignorando mayusculas/minusculas. Uso en el script: validacion flexible de prefijo de ruta.
-
basename($ruta) Devuelve el nombre final de archivo/carpeta. Ejemplo: basename('/var/www/index.php') => 'index.php'
-
realpath($ruta) Resuelve ruta real y normaliza segmentos (.., enlaces, etc.). Devuelve false si no existe.
-
is_dir($ruta) Verifica si la ruta es directorio.
-
is_file($ruta) Verifica si la ruta es archivo.
-
is_writable($ruta) Verifica permisos de escritura. Uso clave antes de guardar o reemplazar archivo.
-
scandir($ruta) Lista contenido de una carpeta. Devuelve arreglo de nombres o false si falla.
-
copy($origen, $destino) Copia archivos. Uso en el script: crear respaldos .bak antes de cambios.
-
file_get_contents($archivo) Lee todo el contenido de un archivo como string. Uso: llenar el textarea de edicion.
-
file_put_contents($archivo, $contenido) Escribe todo el contenido al archivo. Uso: guardar cambios del editor.
-
move_uploaded_file($tmp, $destino) Mueve archivo subido desde ruta temporal de PHP. Uso: reemplazar archivo objetivo con upload.
- date('Ymd_His') Genera timestamp para nombres unicos de respaldo. Ejemplo: archivo.php.bak.20260411_153000
-
htmlspecialchars($txt, ENT_QUOTES, 'UTF-8') Escapa caracteres HTML para evitar XSS. Uso obligatorio al imprimir datos de usuario o rutas.
-
urlencode($txt) Codifica texto para parametros de query string. Uso: ?dir=...
-
rawurlencode($txt) Codifica texto para segmentos de URL. Uso: construir URLs de archivos/carpetas.
-
$_SERVER Informacion del entorno de ejecucion (host, document_root, request_uri, etc.).
-
$_GET Parametros enviados por URL. Uso en el script: dir y edit.
-
$_POST Datos de formularios enviados por metodo POST. Uso en el script: accion, contenido_archivo, archivo_objetivo.
-
$_FILES Archivos subidos por formularios multipart/form-data. Uso en el script: archivo_reemplazo.
-
DIRECTORY_SEPARATOR Separador de rutas segun sistema operativo. Windows: \ | Linux: /
-
UPLOAD_ERR_OK Codigo de exito en subida de archivos. Se compara contra $_FILES['...']['error'].
Reglas aplicadas en el script:
- Validar rutas con realpath antes de usar.
- Confirmar tipo de ruta con is_dir o is_file.
- Validar permisos con is_writable antes de modificar.
- Escapar salida HTML con htmlspecialchars.
- Codificar parametros/segmentos URL con urlencode y rawurlencode.
Escenario:
- Script ubicado en /var/www/server/miserver/uploads/TesteoServidor.php
Navegacion:
- Carga inicial lista uploads.
- Click en Subir nivel muestra contenido de miserver.
- Aparecen carpetas esperadas, por ejemplo:
- uploads
- users
- flags
- Click en Entrar dentro de cualquier carpeta actualiza dir y vuelve a listar.
- Click en breadcrumb permite saltar directo a nivel intermedio.
- En listado de archivos, click en Editar.
- Se abre panel de edicion para ese archivo.
- Opciones:
- Guardar cambios del texto.
- Reemplazar el archivo por upload.
- Antes de modificar, genera respaldo automatico.
- Muestra mensaje de exito o error.
-
La ruta solicitada no es valida: El parametro dir apunta fuera de la base o no existe.
-
El archivo seleccionado para editar no es valido: El archivo no existe, no es archivo o sale del alcance permitido.
-
El archivo no tiene permisos de escritura: Usuario web no puede modificar el archivo.
-
No se pudo listar la carpeta actual: Falta permiso de lectura o ruta invalida.
-
Error al subir archivo de reemplazo: Falla de upload, revisar php.ini y permisos temporales.
- Mantener esta herramienta solo en entorno controlado.
- Restringir acceso por autenticacion.
- Registrar acciones de edicion y reemplazo.
- Revisar permisos minimos necesarios.
- Desactivar display_errors en produccion.
El script implementa un explorador web de archivos con enfoque practico:
- Validacion de rutas.
- Navegacion por carpetas.
- Edicion y reemplazo de archivos.
- Respaldo previo.
- Mensajes de estado.
Con esto tienes una base funcional para administracion de archivos dentro de una zona controlada del servidor.