<aside> 🗺️
Delivery 1 — Tarea 2 | Proyecto: vulnerable-node (PsEA v1.0) | Fecha: 2026-02-08 | Método: Domain-Driven Design Context Mapping
</aside>
El monolito vulnerable-node contiene 4 Bounded Contexts lógicos. La separación de responsabilidades es clara en intención pero deficiente en implementación — Catalog y Orders comparten archivos de ruta y modelo (Shared Kernel de facto).
<aside> 🔐
Responsabilidad: Autenticación de usuarios, gestión de sesiones, guardia de autorización
</aside>
Entidades de Dominio:
User (name: VARCHAR 100 PK, password: VARCHAR 50) — plain text, sin hashingSession (logged: boolean, user_name: string) — objeto transitorio en express-sessionArchivos:
| Archivo | Rol | Líneas Clave |
|---|---|---|
routes/login.js |
Route handler: login form, auth, logout | 54 líneas total |
routes/login_check.js |
Auth guard middleware | 10 líneas — ROTO (sin return) |
model/auth.js |
Data layer: SQL query de autenticación | 12 líneas — CWE-89 en línea 7 |
Endpoints:
| Método | Ruta | Operación | Vulnerabilidades |
|---|---|---|---|
| GET | /login |
Render formulario login | XSS (returnurl sin escapar) |
| POST | /login/auth |
Autenticar credenciales | CWE-89, CWE-601 |
| GET | /logout |
Destruir sesión | Session no destruida (flags only) |
<aside> 🚨
Riesgo Arquitectónico: El auth guard check_logged() en login_check.js:2-7 ejecuta res.redirect() pero no retorna — todo handler posterior continúa ejecutándose sin autenticación. Esto invalida toda la capa de autorización del sistema.
</aside>
<aside> 📦
Responsabilidad: Listado, detalle y búsqueda de productos
</aside>
Entidades de Dominio:
Product (id: INTEGER PK, name: VARCHAR 100, description: TEXT, price: INTEGER, image: VARCHAR 500)