Documentación PROYECTO_DAM
🛡️ Sistema de Autenticación - Backend con Flask + Flet + PostgreSQL (PYTHON)
Este módulo implementa un sistema de autenticación de usuarios para una aplicación híbrida que combina Flet (Python) como interfaz gráfica inicial, Flask como API REST
, y JWT (JSON Web Tokens) para el manejo seguro de sesiones. Además, se utiliza PostgreSQL como sistema gestor de base de datos.
⚙️ Tecnologías utilizadas
Python
>=3.9
Flet – Para crear la interfaz de login y registro.
Flask – Framework para la creación de endpoints backend.
PostgreSQL – Base de datos para el almacenamiento de usuarios.
JWT – Tokens seguros para mantener sesiones activas.
Werkzeug – Hash de contraseñas.
CORS – Compartición de cookies entre Flask y otras apps (como Java frontend).
UUID – Identificadores únicos para cookies de sesión.
📁 Estructura general del proyecto
El código se divide en dos partes principales:
Interfaz Flet:
Permite al usuario registrarse e iniciar sesión.
Muestra mensajes de error o éxito.
Lanza peticiones HTTP a los endpoints de Flask.
API Flask:
/login
: Inicia sesión y establece una cookietoken
./actualizar-datos
: Permite actualizar perfil y contraseña, tanto en la base de datos como en el token./logout
: Elimina la cookie del navegador y de la base de datos.
🔐 Proceso de Autenticación
Registro de Usuario
Se validan los campos del formulario.
Se genera una cookie única con
uuid
.La contraseña se guarda hasheada con
generate_password_hash()
.Se inserta en la base de datos
appusers.usuarios
.
Login de Usuario
Se permite autenticarse por usuario o email.
Si el usuario existe y la contraseña coincide, se genera un token JWT.
El token contiene:
ID, nombre, email, rol, cookie, último login.
Expira en 1 hora.
Se guarda el token en una cookie segura y
httponly
.
Actualización de Datos (/actualizar-datos
)
/actualizar-datos
)El frontend Java accede a este endpoint para editar:
Nombre, apellidos, email, usuario.
Contraseña (requiere la actual para validarlo).
Se actualiza la base de datos y se regenera el token JWT.
La cookie antigua se mantiene, pero el token se renueva.
Logout (/logout
)
/logout
)Elimina la cookie
token
del navegador.Elimina también la cookie asociada al usuario en la base de datos.
Redirige al login.
🗂 Endpoint /eliminar-cuenta
/eliminar-cuenta
📁 Ubicación: Backend Flask – rutas de usuario
🔍 Propósito: Eliminar completamente la cuenta de un usuario autenticado.
🧠 Responsabilidad principal: Validar la identidad del usuario mediante un token, eliminar su cuenta de la base de datos y limpiar su sesión eliminando la cookie.
🛡 Autenticación: Requiere token JWT válido enviado como cookie.
💾 Tabla involucrada: usuarios
🔐 Método HTTP: GET
Pasos clave del flujo:
Obtener
userId
desde la URL: Extrae el ID del usuario a eliminar desde los parámetros de la query (request.args.get("userId")
). Si no se proporciona, devuelve un error400
.Validación del token JWT: Extrae el token de la cookie del navegador (
request.cookies.get("token")
). Si falta o es inválido (usandoverify_token(token)
), devuelve un error400
o403
.Conexión a la base de datos y eliminación: Se conecta a la base de datos PostgreSQL y ejecuta un
DELETE FROM usuarios WHERE id = %s
. Si el usuario existe y se elimina correctamente (cursor.rowcount > 0
), se continúa.Eliminación de la cookie de sesión: Crea una respuesta de redirección al login y elimina la cookie
token
del navegador:
Redirección final: El usuario es redirigido al login (
http://localhost:30050/
).
Código destacado:
📌 Nota:
El endpoint gestiona errores de forma clara, devolviendo mensajes informativos ante fallos en parámetros, autenticación o conexión a base de datos.
🧠 Seguridad y Buenas Prácticas
Las contraseñas se almacenan encriptadas (
hash
).Los JWT tienen una duración limitada (
1h
).Las cookies son
httponly
ysamesite=strict
.Se verifica la validez del token en cada endpoint sensible.
🧩 Bases de Datos
Base de datos: appusers
appusers
Contiene la tabla usuarios
:
id
SERIAL
Clave primaria
nombre
TEXT
Nombre del usuario
apellidos
TEXT
Apellidos del usuario
TEXT
Correo electrónico
usuario
TEXT
Nombre de usuario único
password_hash
TEXT
Contraseña encriptada
cookie
UUID
Token de sesión interno
rol
TEXT
Rol del usuario (por defecto user
)
estado
BOOLEAN
Estado de la cuenta
fecha_registro
TIMESTAMP
Fecha de creación
ultimo_login
TIMESTAMP
Último acceso
🖼️ Interfaz con Flet
Flet permite mostrar una interfaz web simple:
Registro de nuevos usuarios.
Inicio de sesión.
Redirección a
animation.jsp
del sistema Java tras iniciar sesión.
🧪 Ejecución del sistema
Inicia la app de Flask en un hilo:
Arranca la interfaz Flet:
El puerto
5000
queda disponible para peticiones desde Java u otrosfrontends
.
📬 Endpoints disponibles
/login
GET/POST
Inicia sesión y genera una cookie con el token
/actualizar-datos
POST
Actualiza el perfil del usuario autenticado
/logout
POST
Cierra la sesión y elimina la cookie
/eliminar-cuenta
GET
Elimina la cuenta del usuario mediante el ID
📌 Notas
Este sistema sirve como backend para aplicaciones Java (por ejemplo, desde JSP).
Las cookies compartidas permiten mantener sesiones cruzadas entre Flask y Java.
Ideal para separar lógica de autenticación del sistema principal.
🧱 Estructura del Proyecto Java Web (JSP/Servlets + Flask Backend)
🔌 1. Conexión a Base de Datos
main/java/conexionDDBB/ConexionDDBB.java
Clase responsable de establecer la conexión con la base de datos. 📌 Conectada a servicios de backend denominados "Hackend".
🧠 2. Lógica de Negocio – Controladores
Estos controladores (Servlets y clases Java) gestionan la interacción entre la vista (JSPs) y la base de datos o el backend de Flask. Todos requieren autenticación mediante token JWT.
ActualizarPerfilServlet.java
Actualiza los datos del usuario autenticado. Se comunica con un endpoint en Flask.AgregarLaboratorioControlador.java
Permite al usuario con rol Designer insertar nuevos laboratorios en la base de datos.FotoControlador.java
Gestiona operaciones de foto de perfil: subir, modificar y eliminar.LogControlador.java
Encargado de registrar eventos del sistema (auditoría, seguridad, etc.).LogoutServlet.java
Maneja el cierre de sesión invocando un endpoint Flask.ValidateFlagControlador.java
Valida la bandera del laboratorio (para verificar si fue resuelto correctamente por el usuario).
🗃️ 3. Acceso a Datos – DAOs
Implementan el acceso a base de datos para cada componente del sistema. Separan la lógica de persistencia del resto del código.
FotoDAO.java
/FotoPerfilDAO.java
Gestionan la obtención, inserción y modificación de las fotos de perfil del usuario en la base de datos.LaboratorioDAO.java
Realiza operaciones sobre los datos de los laboratorios (crear, listar, etc.).ValidateFlagDAO.java
Accede a los datos necesarios para validar los flags enviados por los usuarios en cada laboratorio.
🧰 4. Utilidades
JWTUtils.java
Contiene lógica para crear, verificar o manejar tokens JWT.UsuariosJWT.java
Extrae la información del usuario contenida en un token JWT (como nombre, rol, id, etc.).
🎨 5. Vista – JSP, CSS, JS, Recursos Estáticos
Las páginas JSP son el frontend del sistema. Se combinan con CSS/JS y recursos estáticos para la experiencia de usuario. Acceso restringido mediante JWT.
📄 Páginas JSP
animation.jsp
– Página de animación al abrir el navegador.editarPerfil.jsp
– Permite al usuario autenticado editar su perfil.profile.jsp
– Muestra la información del perfil del usuario.home_directory/*.jsp
– Páginas de navegación principales (Home, Page1 a Page4).labs/foro-xss.jsp
– Laboratorio para pruebas de XSS.labs/hackend.jsp
– Página informativa relacionada con el backend Flask.labs/none.jsp
– Página de “en construcción” para laboratorios no implementados.
🎨 CSS
animation.css
,editarPerfilUpdate.css
,foro-xss.css
,home.css
,profileUpdate.css
Archivos de estilo asociados a sus respectivas vistas JSP.
💻 JS
animation.js
,foro-xss.js
,home.js
Scripts que complementan la interacción de usuario en las páginas específicas.
🖼️ Recursos
main/webapp/img/
– Carpeta de imágenes usadas por el sistema (íconos, avatares, ilustraciones, etc.).
🔐 Seguridad
⚠️ Todas las páginas y endpoints están protegidos por validación de token JWT.
La validación ocurre tanto en el frontend (para acceso visual) como en el backend (para procesar las acciones).
DOCUMENTACIÓN APLICACION JAVA (CODIGO)
🔌 ConexionDDBB.java
ConexionDDBB.java
📁 Ubicación: main/java/conexionDDBB/
🧠 Función: Gestiona la conexión y desconexión con la base de datos PostgreSQL.
✨ Descripción
Esta clase encapsula la lógica necesaria para conectarse a una base de datos PostgreSQL. Carga el driver al iniciar y ofrece métodos públicos para abrir y cerrar la conexión.
📄 Código Documentado
🔐 ActualizarPerfilServlet.java
ActualizarPerfilServlet.java
📁 Ubicación: main/java/controlador/
🧠 Función: Servlet encargado de actualizar los datos del usuario a través de un endpoint en Flask, usando JWT para autenticación.
✨ Descripción
Este servlet procesa solicitudes POST desde un formulario JSP (editarPerfil.jsp
) para actualizar los datos del perfil del usuario autenticado. Extrae el token JWT desde una cookie, lo valida, y envía los datos al backend Flask. Si se recibe un nuevo token tras la actualización, lo reemplaza en las cookies activas del navegador.
📄 Código Documentado
🧪 AgregarLaboratorioControlador.java
AgregarLaboratorioControlador.java
📁 Ubicación: main/java/controlador/
🧠 Función: Gestiona la lógica para agregar un nuevo laboratorio desde un formulario en la interfaz.
✨ Descripción
Este servlet se encarga de procesar el formulario para registrar un nuevo laboratorio en el sistema. Valida que los puntos sean un número entero positivo antes de insertar la información en la base de datos mediante LaboratorioDAO
.
📄 Código Documentado
🖼️ FotoControlador.java
FotoControlador.java
📁 Ubicación: main/java/controlador/
🧠 Función: Maneja la subida o eliminación de la foto de perfil de un usuario.
✨ Descripción
Este servlet permite a los usuarios subir o eliminar su foto de perfil. Valida el archivo recibido (nombre, formato y extensión) y lo guarda en el directorio /uploads
. Luego, actualiza la ruta de la imagen en la base de datos mediante el FotoPerfilDAO
.
📄 Código Documentado
📄 LogControlador.java
LogControlador.java
📁 Ubicación: main/java/controlador/
🧠 Función: Mostrar el archivo de logs de Eclipse en el navegador, útil para depuración en desarrollo.
✨ Descripción
Este servlet permite acceder desde el navegador al contenido del archivo .log
de Eclipse ubicado en el workspace del usuario. Es especialmente útil para desarrolladores al momento de revisar excepciones o errores recientes sin necesidad de abrir Eclipse.
📄 Código Documentado
⚠️ Nota: Este servlet no debe estar activo en producción, ya que expone información sensible del entorno de desarrollo.
🔐 LogoutServlet.java
LogoutServlet.java
📁 Ubicación: main/java/controlador/
🧠 Función: Cierra la sesión del usuario tanto en el sistema Java como en el backend Flask, y elimina el token de autenticación.
✨ Descripción
Este servlet maneja el proceso de cierre de sesión del usuario. Invalida la sesión actual, borra la cookie del token JWT y realiza una llamada HTTP al backend Flask para invalidar la sesión desde ese lado también. Finalmente, redirige al frontend (ejecutado con Flet) para que el usuario vea la pantalla de login.
📄 Código Documentado
🏁 ValidateFlagControlador.java
ValidateFlagControlador.java
📁 Ubicación: main/java/controlador/
🧠 Función: Validar si una flag ingresada por el usuario es correcta para un laboratorio específico.
✨ Descripción
Este servlet se encarga de validar flags en retos del tipo CTF (Capture The Flag). Usa JWT para identificar al usuario, verifica si ya ha validado la flag, y si no lo ha hecho, comprueba si la flag ingresada es correcta. Si lo es, registra la validación en la base de datos y asigna los puntos correspondientes.
📄 Código Documentado
🔐 Seguridad: El uso de JWT garantiza que solo usuarios autenticados pueden validar flags.
🗂 Vista TablaController
TablaController
📁 Ubicación: controlador/TablaControlador.java
🔍 Propósito: Controlador para gestionar operaciones CRUD sobre tablas (insertar, eliminar, actualizar).
🧠 Responsabilidad principal: Procesar solicitudes POST
para insertar, eliminar y actualizar registros en las tablas de la base de datos.
🎯 Método HTTP: POST
🎨 Estilo: Tema oscuro con enfoque en lógica de negocio y acceso a datos.
Funcionalidades principales:
Insertar registros: Utiliza el método
insertar
delTablaDAO
para agregar un nuevo registro a la tabla indicada.Eliminar registros: Llama al método
eliminar
delTablaDAO
pasando el valor de la clave primaria y el nombre de la tabla.Actualizar registros: Utiliza el método
actualizar
delTablaDAO
para modificar un registro específico basándose en el valor de la clave primaria.
Código destacado:
🗂 Vista TablaDAO
TablaDAO
📁 Ubicación: dao/TablaDAO.java
🔍 Propósito: Acceso a datos para realizar operaciones CRUD sobre las tablas de la base de datos.
🧠 Responsabilidad principal: Gestionar las operaciones sobre tablas y registros en la base de datos (consultas, inserciones, eliminaciones y actualizaciones).
🎯 Método HTTP: N/A (Clase de acceso a datos).
Funcionalidades principales:
Obtener lista de tablas: El método
getListaTablas
obtiene los nombres de todas las tablas de la base de datos.Obtener columnas de una tabla:
getColumnas
permite obtener los nombres de las columnas de una tabla específica.Obtener datos de una tabla:
getDatos
obtiene todas las filas de una tabla dada.Insertar un nuevo registro: El método
insertar
crea una sentencia SQL dinámica para insertar un registro en la tabla especificada.Eliminar un registro:
eliminar
construye una consulta SQL para borrar un registro de la tabla según su clave primaria.Actualizar un registro:
actualizar
construye y ejecuta una sentencia SQLUPDATE
para modificar un registro específico de la tabla.
Código destacado:
🗂 Vista ViewTablesControlador
ViewTablesControlador
📁 Ubicación: controlador/ViewTablesControlador.java
🔍 Propósito: Controlador para visualizar las tablas y sus datos.
🧠 Responsabilidad principal: Recuperar las tablas y sus datos desde la base de datos y generar el HTML para mostrarlas en la vista.
🎯 Método HTTP: GET
🎨 Estilo: Tema oscuro con vista de tablas dinámicas.
Funcionalidades principales:
Obtener y mostrar tablas: El controlador obtiene el nombre de todas las tablas en la base de datos y las muestra en una estructura HTML.
Obtener y mostrar columnas de cada tabla: Para cada tabla, se obtienen las columnas y se muestran en una tabla HTML.
Mostrar los datos de cada tabla: Se consulta y muestra el contenido de cada tabla en una tabla HTML.
Código destacado:
🖼️ FotoDAO.java
FotoDAO.java
📁 Ubicación: main/java/dao/
🧠 Función: Recuperar la ruta de la foto de perfil de un usuario desde la base de datos.
✨ Descripción
Esta clase DAO consulta la tabla profile
para obtener la ruta (photo_path
) de la imagen de perfil de un usuario específico. Es utilizada para mostrar o cargar la foto en distintas partes del sistema.
📄 Código Documentado
💡 Tip: Este DAO puede extenderse para actualizar o eliminar la foto si se requiere.
📸 FotoPerfilDAO.java
FotoPerfilDAO.java
📁 Ubicación: main/java/dao/
🧠 Función: Gestiona la actualización y eliminación de la foto de perfil del usuario.
✨ Descripción
FotoPerfilDAO
se encarga de insertar, actualizar o eliminar la foto de perfil de un usuario en la base de datos. Además, maneja la eliminación física del archivo de imagen del servidor cuando es necesario.
📄 Código Documentado
📌 Nota: Asegúrate de que la aplicación tenga permisos de escritura en el directorio donde se guardan las imágenes.
🧪 LaboratorioDAO.java
LaboratorioDAO.java
📁 Ubicación: main/java/dao/
🧠 Función: Acceso y manipulación de datos de la tabla laboratorios
.
✨ Descripción
La clase LaboratorioDAO
proporciona operaciones para gestionar laboratorios dentro de un sistema de retos tipo CTF. Incluye funciones para crear la tabla si no existe, insertar nuevos laboratorios, y consultar información como el nombre, flag, y puntos asociados a un laboratorio.
📄 Código Documentado
🛡️ Recomendación: Para mejorar robustez, considera manejar excepciones con mensajes personalizados o logs más detallados.
🗂 Clase ValidateFlagDAO
ValidateFlagDAO
📁 Ubicación: dao/ValidateFlagDAO.java
🔍 Propósito: Gestionar la validación de flags por parte de los usuarios en los laboratorios.
🧠 Responsabilidad principal: Registrar y comprobar si un usuario ya ha validado la flag de un laboratorio.
💾 Tabla involucrada: validate_flag
Métodos clave:
ensureTableExists()
Verifica si existe la tablavalidate_flag
, y si no, la crea con las columnas:id
,user_id
,lab_id
,flag
,puntos
hasFlagBeenValidated(int userId, int labId)
Retornatrue
si el usuario ya validó la flag de un laboratorio específico,false
si no.registerFlagValidation(int userId, int labId, String flag, int puntos)
Inserta un registro en la tablavalidate_flag
cuando un usuario valida correctamente una flag, incluyendo los puntos ganados.
🔐 Clase JWTUtils
JWTUtils
📁 Ubicación: utils/JWTUtils.java
🔍 Propósito: Extraer información de un JWT presente en las cookies del request HTTP.
🧠 Responsabilidad principal: Obtener un objeto UsuarioJWT
a partir del token de autenticación.
🔑 Clave secreta: "clave_super_secreta"
Métodos clave:
obtenerUsuarioDesdeRequest(HttpServletRequest request)
Extrae y valida el JWT desde las cookies delHttpServletRequest
, devolviendo un objetoUsuarioJWT
con:nombre
,apellidos
,rol
,email
,ultimoLogin
,usuario
,cookie
,userId
,token
⚠️ Lanza excepciones si:
No hay token en las cookies
El token está expirado
El token no es válido
obtenerTokenDesdeCookies(HttpServletRequest request)
Busca la cookie llamada"token"
y retorna su valor (el JWT).
👤 Clase UsuarioJWT
UsuarioJWT
📁 Ubicación: utils/UsuarioJWT.java
🔍 Propósito: Representar a un usuario autenticado a través de un token JWT.
🧠 Responsabilidad principal: Almacenar los detalles de un usuario extraídos de un token JWT.
Atributos:
nombre
: Nombre del usuario.apellidos
: Apellidos del usuario.rol
: Rol del usuario (ej.admin
,usuario
).email
: Dirección de correo electrónico del usuario.ultimoLogin
: Fecha/hora del último inicio de sesión.usuario
: Nombre de usuario (username).cookie
: Información asociada a la cookie (si corresponde).userId
: ID único del usuario.token
: El token JWT del usuario.
Métodos clave:
Constructor El constructor recibe todos los atributos mencionados para crear un objeto
UsuarioJWT
.Getters Métodos para acceder a cada uno de los atributos (nombre, apellidos, rol, email, último login, usuario, cookie, userId, token).
🌀 animation.jsp
animation.jsp
📁 Ubicación: webapp/animation.jsp
Este archivo representa una pantalla animada de transición o bienvenida, posiblemente usada al inicio de sesión o redirección. Aquí va su explicación:
🔐 Validación JWT:
Se importa
JWTUtils
yUsuarioJWT
para verificar el token del usuario.Si el token no es válido o no se puede extraer el usuario →
redirect
al servlet de/logout
(evitando cargar la página sin sesión activa).
🔄 Redirección automática:
Utiliza
<meta http-equiv="refresh" content="4; url=home_directory/home.jsp?page=0">
para redirigir al usuario automáticamente a la página principal después de 4 segundos.
💻 UI / Estética:
Icono de "Navegador" con clase
desktop-icon
.Un div
.browser-window
simulando una ventana del navegador.Cursor animado (
#cursor
) para agregar un toque retro/interactivo.Estilos personalizados cargados desde
/css/animation.css
.Scripts de comportamiento en
/js/animation.js
.
💡 Nota:
Hay un video de fondo comentado —podría usarse para una experiencia más inmersiva—.
La estructura simula un sistema operativo o escritorio virtual antiguo, posiblemente con un enfoque nostálgico/retro.
🏠 home.jsp
home.jsp
📁 Ubicación: home_directory/home.jsp
(Le siguen el mismo estilo las paginas Page1.jsp
, Page2.jsp
, Page3.jsp
y Page4.jsp
)
Este archivo representa la página principal del sistema, tipo buscador de labs/recursos, con navegación por páginas. Aquí va su desglose:
🔐 Validación del token JWT:
Se usa
JWTUtils
para validar el token del usuario.Si el token es inválido o no contiene
userId
, redirige al servlet/logout
o muestra error.
🖼️ Carga dinámica de foto de perfil:
Se obtiene vía
FotoDAO
con eluserId
contenido en el token.Si no existe una foto → se muestra una por defecto (
img/Profile.png
).
🎨 UI y elementos visuales:
Header con logo e imagen de perfil.
Si el usuario tiene el rol
designer
, se muestra un botón haciaadmin-panel.jsp
.Navbar con secciones (Hackend, DockerPwned, OVAlabs...) y menú desplegable:
Filtros por tipo, dificultad, tags, creadores.
Barra de búsqueda
#liveSearch
con iconos (borrar, micro, cámara).Sección
.results
para mostrar resultados de búsqueda.
🧠 JS dinámico y búsqueda:
Carga resultados simulados (mockeados) desde un array de objetos en JS.
Cada resultado incluye: imagen, título, descripción y tags.
Tags se renderizan visualmente como
#nombre
.Soporte para navegación entre páginas (
page=0
,page=1
...), incluida funcionalidad del botón “Siguiente”.
🔢 Paginación:
Muestra páginas numeradas (1 a 5).
Cambia el estilo de la letra "O" en el logo de Google (Hackend) para representar la página activa.
Función
highlightCurrentPage()
lo gestiona dinámicamente.El botón "Siguiente" redirige a la siguiente página (
Page1.jsp
,Page2.jsp
, etc).
🦶 Footer básico:
Información de autores ("d1se0 y m4nu"), enlaces a ayuda, privacidad, términos, etc.
🎯 Scripts extra:
Asegura que los enlaces no se abran en
_blank
, sino en la misma ventana (_self
).home.js
es cargado adicionalmente al final, lógica extendida.
📄 Archivo: profile.jsp
profile.jsp
📁 Ubicación: webapp/profile.jsp
📌 Descripción:
Esta vista muestra al usuario su información de perfil recuperada desde el token JWT. Muestra nombre, correo, rol, última sesión, imagen de perfil, y permite cerrar sesión o navegar a la edición del perfil.
✅ Aspectos clave:
Seguridad JWT: Verifica la validez del token con
JWTUtils.obtenerUsuarioDesdeRequest(request)
y redirige a logout si no es válido.Imagen de perfil: Usa
FotoDAO
para obtener la ruta de la imagen de perfil y carga una imagen por defecto si no se encuentra.Presentación personalizada: Usa estilos visuales modernos con un diseño tipo "pantalla retro" con botones inspirados en macOS.
Datos mostrados del token:
Usuario
Rol
Email
Nombre y apellidos
Último login
Cookie y token JWT como texto plano
Opciones de acción:
Botón para cerrar sesión (
/logout
)Botón para editar el perfil (
editarPerfil.jsp
)
📄 Archivo: editarPerfil.jsp
editarPerfil.jsp
📁 Ubicación: webapp/editarPerfil.jsp
📌 Descripción:
Vista para que el usuario edite sus datos personales y su contraseña, así como para actualizar o eliminar su foto de perfil. Toda la información se rellena automáticamente desde el token JWT.
✅ Aspectos clave:
Seguridad JWT: Igual que
profile.jsp
, valida el token y redirige a logout si no es válido.Formulario dividido en dos funcionalidades:
Editar datos personales:
Nombre
Apellidos
Email
Usuario
Cambiar contraseña (requiere contraseña actual + nueva y confirmación)
Incluye el token como campo oculto para el backend
Subir/eliminar foto de perfil:
Subida de nueva imagen (
multipart/form-data
)Botón para eliminar la imagen actual
Reutiliza el estilo visual de
profile.jsp
(pantalla estilo monitor, madera de fondo, botones de ventana).El formulario de foto hace POST a
SubirFotoPerfil?user_id=...
, enlazando directamente con el backend para subir o eliminar imágenes.
🎞️ animation.css
animation.css
📁 Ubicación: css/animation.css
✅ Objetivo
Simular una experiencia visual al estilo de un escritorio clásico (como Windows XP) con íconos de escritorio, un video de fondo, y elementos animados para dar un toque interactivo/retro.
🧱 Estructura Clave
Fuentes & Fondo:
Usa una fuente monoespaciada para consistencia en ciertos elementos.
Estilo principal retro, simulando un escritorio con imagen fija al fondo.
Video de fondo:
Hace que el video se expanda a toda la pantalla y quede detrás de los elementos (por el
z-index: -1
).Íconos de escritorio:
Estiliza íconos tipo "acceso directo" en una ubicación fija.
Cursor personalizado:
Usa una imagen personalizada como cursor. Importante para experiencias inmersivas o nostálgicas.
Ventana tipo navegador (oculta por defecto):
Simula ventanas emergentes estilo navegador clásico.
💡 Toques Interesantes
Cursor bloqueado en la pantalla y reemplazado por imagen personalizada.
Simulación de un escritorio de sistema operativo.
Muy útil si estás creando un sistema tipo "emulador visual" o "explorador vintage".
🧩 editarPerfilUpdate.css
editarPerfilUpdate.css
📁 Ubicación: css/editarPefilUpdate.css
✅ Objetivo
Dar estilo a una pantalla con apariencia de monitor retro, donde el usuario puede editar su información. Simula una ventana de sistema operativo antigua, con un toque profesional, limpio y funcional.
🧱 Estructura Clave
Contenedores:
Componen un "monitor de computadora" completo: pantalla, soporte y base.
Todo centrado en la pantalla.
Formulario:
Fondo translúcido negro para contraste.
Scrollbar personalizado.
Estilo moderno para inputs, con acento azul (#00aaff).
Botones estilo MacOS:
Estética similar a las ventanas de macOS (cerrar, minimizar, maximizar).
Scroll personalizado:
Compatible tanto con WebKit como con navegadores Firefox.
Control del cursor:
Usa clases dinámicas para habilitar/deshabilitar la interacción.
Ideal para experiencias "inmersivas".
💡 Toques Interesantes
Muy elegante la separación entre "formulario de edición" y "subir foto".
Excelente uso de
scrollbar
ypointer-events
para experiencia inmersiva.Detalles visuales como
box-shadow
,border-radius
, y colores oscuros brindan una sensación pro.
🧠 En Resumen:
animation.css
Simulación de escritorio interactivo retro
Video de fondo, cursor personalizado, íconos flotantes
editarPerfilUpdate.css
UI para edición de perfil en pantalla simulada
Estilo retro-moderno, scroll personalizado, botones macOS
🔷 home.css
(Estilo principal para la página de inicio)
home.css
(Estilo principal para la página de inicio)📁 Ubicación: css/home.css
🌑 Base y tipografía
🧭 Encabezado / Header
🔍 Barra de búsqueda
🧭 Navegación / Menú
📂 Menú desplegable y submenús
📄 Resultados de búsqueda
🔢 Paginación
📦 Footer
🏷️ Tags
🟢 profileUpdate.css
(Estilo tipo consola/GitHub para perfil)
profileUpdate.css
(Estilo tipo consola/GitHub para perfil)📁 Ubicación: css/profileUpdate.css
🧱 Layout y fuente general
🪟 Header tipo ventana
💬 Comentarios
💡 Botón solución flotante
💬 Popup tipo ventana
💬 Comentarios rápidos
⚠️ Alerta tipo XSS
🖥️ Vista foro-xss.jsp
foro-xss.jsp
📁 Ubicación: labs/foro-xss.jsp
🔍 Propósito: Simula un foro web vulnerable a XSS como parte del laboratorio práctico para que el usuario aprenda a explotar la vulnerabilidad y obtenga una flag.
🧠 Responsabilidad principal: Renderizar la interfaz del laboratorio XSS, gestionar los comentarios y mostrar la flag al explotar exitosamente la vulnerabilidad.
💾 Dependencias clave: LaboratorioDAO
, JWTUtils
, validarFlag
, foro-xss.css
, foro-xss.js
🛠 Funcionalidades principales:
🔑 Autenticación y validación del token JWT
Extrae el token desde la request usando
JWTUtils.obtenerUsuarioDesdeRequest(request)
Redirige a
/logout
si el token no es válido.
🧪 Identificación del laboratorio
Obtiene el ID del laboratorio XSS mediante
LaboratorioDAO.obtenerIdLaboratorioForoXss()
.
📥 Envío de FLAG
Formulario que envía los parámetros
user_id
,lab_id
, yflag
al servletvalidarFlag
mediante métodoGET
.
💬 Renderizado de comentarios estilo foro
Se muestran comentarios estáticos simulando interacción entre usuarios sobre temas de XSS.
Cada bloque contiene: usuario, timestamp, texto y botones de interacción (like/responder).
📜 Inyección de JS desde backend
Código JavaScript embebido simula un
hook
de XSS: al ejecutarse unalert
, también muestra el mensaje con la flag.
💡 Popup de solución
Botón amarillo flotante muestra una explicación con ejemplos prácticos sobre cómo explotar XSS para obtener la flag.
📢 Popup emergente de validación de flag
Si
mensaje
(param. en URL) existe, se muestra en un popup personalizado centrado en pantalla.
🎨 Estilo visual (CSS): foro-xss.css
foro-xss.css
📁 Ubicación: css/foro-xss.css
🎯 Propósito: Dar una estética dark mode tipo consola con un diseño moderno, limpio y con efectos visuales llamativos para una experiencia tipo CTF.
Destacados del diseño:
Tema oscuro y tipografía tipo terminal: Usa
Courier New
y una paleta basada en#0d1117
con acentos en#00ffcc
.Foro con tarjetas (
.comment-box
) Estilo responsive, bordes redondeados, color de fondo sobrio y comentarios organizados.Popups personalizados: Diseñados para soluciones y mensajes emergentes con sombras, centrado automático y efectos de transición.
Botón solución flotante: Estilo brillante y con sombra tipo neón (
radial-gradient
) para llamar la atención.
💬 Script foro-xss.js
📁 Ubicación: js/foro-xss.js
🔍 Propósito: Manejar la publicación de comentarios en el foro con protección básica contra ataques XSS.
🧠 Responsabilidad principal: Detectar e impedir la ejecución de scripts maliciosos inyectados por los usuarios, renderizar comentarios de forma segura, y gestionar interacciones como "me gusta".
Funcionalidades clave:
detectarXSS(texto) Detecta si el texto contiene etiquetas
<script>
usando una expresión regular. Muestra un popup y lanza una excepción si detecta XSS.escapeHTML(str) Reemplaza caracteres especiales (
<
,>
,"
,'
,&
) por sus entidades HTML para evitar la ejecución de código malicioso.commentForm.addEventListener('submit', ...) Maneja el envío del formulario de comentarios. Escapa el contenido y crea la estructura HTML del comentario dinámicamente. Previene XSS.
forumContainer.addEventListener('click', ...) Escucha clics en botones dentro de los comentarios para aumentar el contador de "me gusta".
showPopup() / closePopup() Funciones auxiliares para mostrar y cerrar el popup de solución cuando se valida correctamente una respuesta.
🖱️ Script animation.js
📁 Ubicación: js/animation.js
🔍 Propósito: Ejecutar una animación visual que simula el movimiento del cursor hacia un icono y luego mostrar el navegador.
🧠 Responsabilidad principal: Crear una introducción interactiva o guía visual al cargar la interfaz.
Funcionalidades clave:
Animación del cursor: Calcula la posición del icono objetivo y anima el cursor desde el centro de la pantalla hasta él.
Mostrar navegador: Tras finalizar la animación del cursor (2s), muestra el elemento navegador (
#navegador
) con un pequeño retraso.
🏠 Script home.js
📁 Ubicación: js/home.js
🔍 Propósito: Gestionar el menú principal, buscador en vivo, filtros por tipo/tag, y renderizado dinámico de resultados en la página principal.
🧠 Responsabilidad principal: Crear una experiencia interactiva e intuitiva para navegar entre retos, filtrarlos, buscarlos y clasificarlos.
Funcionalidades clave:
Menú desplegable (moreButton): Muestra/oculta el menú adicional, expandiendo o contrayendo el cuerpo de la página.
Motor de búsqueda en vivo: Escucha cambios en el input de búsqueda y filtra dinámicamente los resultados en base a título y tags.
Botón clearSearch: Limpia el input del buscador y reinicia los resultados.
Filtros por tipo y tags: Permite seleccionar uno por bloque. Aplica clases
selected
/unselected
, actualiza el estado global de los filtros y vuelve a renderizar los resultados.renderResults(results): Crea dinámicamente los bloques de resultados (favicon, título, descripción, tags), limpiando los anteriores.
Inicialización con
DOMContentLoaded
: Carga todos los resultados disponibles al iniciar la página y asigna eventos de filtros.
🗂 Archivo none.jsp
📁 Ubicación: labs/none.jsp
🔍 Propósito: Mostrar una página informativa que indique que una sección está en construcción y redirigir al usuario si no está autenticado.
🧠 Responsabilidad principal: Proporcionar un mensaje de "en construcción" y manejar la autenticación del usuario a través de un JWT (JSON Web Token).
🔑 Funcionalidad clave:
Autenticación del usuario: Utiliza el método
JWTUtils.obtenerUsuarioDesdeRequest(request)
para verificar si el usuario está autenticado. Si no es así, redirige a la página de cierre de sesión (logout
).Mensaje de construcción: Muestra un mensaje visual con un emoji de construcción 🚧 y un texto indicando que la sección está en construcción.
Secciones clave:
JWTUtils.obtenerUsuarioDesdeRequest(request): Intenta obtener la información del usuario desde el JWT en la solicitud. Si la obtención falla, redirige al usuario al servlet de logout.
Estructura HTML: Presenta una interfaz sencilla y centrada con un mensaje de "en construcción", un emoji que refuerza el tema, y un enlace que redirige al usuario de vuelta a la página principal (
home.jsp
).Estilo básico: El estilo de la página incluye un diseño minimalista centrado, con un fondo claro, sombra para darle profundidad y un toque amigable con un emoji grande.
🗂 Vista admin-panel.jsp
admin-panel.jsp
📁 Ubicación: designer/admin-panel.jsp
🔍 Propósito: Panel administrativo exclusivo para usuarios con rol designer
.
🧠 Responsabilidad principal: Ofrecer acceso a funcionalidades avanzadas como gestión de laboratorios, logs del sistema y visualización de la base de datos.
🛡 Control de acceso: Requiere token JWT válido y rol designer
. Si el usuario no tiene permisos, se muestra un mensaje de "No autorizado".
Funcionalidades disponibles desde el panel:
🔍 Ver últimos logs del sistema: Redirecciona al formulario
verLogs.jsp
víaPOST
.🧪 Insertar nuevos laboratorios: Redirecciona a
agregarLaboratorio.jsp
, donde se puede crear un nuevo laboratorio con nombre, flag y puntos.📊 Visualizar tablas de la base de datos: Enlace a
viewTables.jsp
para inspeccionar tablas del backend.🛠 Insertar / Eliminar / Modificar tablas: Redirecciona a
manageTables.jsp
para una gestión más profunda sobre la base de datos.🔙 Volver al home: Redirige a
home.jsp?page=0
.
Código relevante:
🗂 Vista agregarLaboratorio.jsp
agregarLaboratorio.jsp
📁 Ubicación: designer/agregarLaboratorio.jsp
🔍 Propósito: Formulario visual para registrar un nuevo laboratorio en la base de datos.
🧠 Responsabilidad principal: Enviar datos al endpoint agregarLaboratorio
con nombre, flag y puntos.
🎯 Método HTTP: POST
🎨 Estilo: Tema oscuro con diseño centrado y tipografía tipo terminal (Courier).
Campos del formulario:
📌 Nombre del laboratorio: Campo de texto requerido (
nombre
).🚩 Flag: Campo de texto requerido (
flag
).⭐ Puntos: Campo numérico requerido (
puntos
).
Funcionalidades adicionales:
💬 Mensaje de éxito: Si el atributo
mensaje
está presente en la request (por ejemplo, tras insertar un laboratorio con éxito), se muestra como mensaje destacado.🔙 Botón para volver al panel: Enlace estilizado que lleva de vuelta a
admin-panel.jsp
.
Código destacado:
✅ manageTables.jsp
– Gestión de Tablas
manageTables.jsp
– Gestión de Tablas📁 Ubicación: designer/manageTables.jsp
🧠 Qué hace:
Verifica si el usuario es
designer
.Permite ver, insertar, actualizar y eliminar registros de cualquier tabla en la base de datos.
Usa
TablaDAO
para operaciones de lectura.
🛡️ Seguridad:
✅ Autenticación y autorización con
JWTUtils
.⚠️ Peligro potencial: no hay validación de los valores insertados/actualizados directamente desde el formulario.
⚠️ La detección de la clave primaria es manual y limitada (
id
olab_id
). Esto puede fallar para otras tablas.⚠️ Injection risk: si
TablaController
no realiza validación/escapado, se expone a SQL Injection.
🎨 UX/UI:
Muy funcional pero el diseño puede saturar si hay muchas columnas o filas.
Los formularios de update se mezclan con los de lectura, lo que puede resultar algo confuso.
💡 Sugerencias:
Extraer la clave primaria desde
DAO.getPrimaryKey(tabla)
.Añadir confirmación JavaScript para eliminar registros.
Separar UI de edición (popup/modal o nueva sección).
Validar y sanitizar inputs tanto en frontend como backend.
✅ verLogs.jsp
– Visualización de Logs
verLogs.jsp
– Visualización de Logs📁 Ubicación: designer/verLogs.jsp
🧠 Qué hace:
Realiza polling AJAX cada 5 segundos a
/getLogs
para mostrar los últimos logs.Interfaz muy minimalista.
🛡️ Seguridad:
⚠️ No verifica autorización del usuario en este JSP directamente (aunque el acceso es desde un panel restringido).
⚠️ Si
/getLogs
no valida el rol, cualquier usuario podría explotarlo.
🎨 UX/UI:
Simple y efectivo.
Autoscroll al final es útil, pero puede ser molesto en logs muy largos.
💡 Sugerencias:
Validar en el servlet
/getLogs
que el usuario seadesigner
.Añadir control para pausar la actualización automática.
Añadir filtros por nivel de log, fecha, etc.
✅ viewTables.jsp
– Vista general de las tablas
viewTables.jsp
– Vista general de las tablas📁 Ubicación: designer/viewTables.jsp
🧠 Qué hace:
Carga dinámicamente la estructura de la base de datos vía
/getTables
.Muestra todo en un
div
con AJAX.
🛡️ Seguridad:
✅ Autenticación y autorización correcta.
⚠️ Verificar que
/getTables
haga validación del token.
🎨 UX/UI:
Interfaz sencilla. La carga AJAX está bien pensada.
Puede ser útil un spinner o animación mientras carga.
💡 Sugerencias:
Añadir botón de “Recargar” o autorefresco opcional.
Agregar capacidad de exportar a CSV/JSON.
Visualización más amigable si hay muchas columnas.
Conclusión general 🔍
manageTables.jsp
✅
⚠️
Evitar SQL Injection
verLogs.jsp
⚠️
⚠️
Validar acceso en /getLogs
viewTables.jsp
✅
⚠️
Validar acceso en /getTables
Last updated