jerkjs 2.5.4 → 2.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BENCHMARK_RESULTS.md +60 -0
- package/CHANGELOG.md +43 -0
- package/ESTADISTICAS_RENDIMIENTO.md +106 -0
- package/README.md +142 -423
- package/README_LEGACY.md +513 -0
- package/debug_hook.js +11 -0
- package/doc-2.5/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/doc-2.5/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/doc-2.5/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/doc-2.5/CACHE_SYSTEM_MAP.md +206 -0
- package/doc-2.5/SESSION_SECURITY_FLAGS.md +174 -0
- package/doc-2.5/an/303/241lisis-completo-jerk-framework.md +213 -0
- package/docs/CACHE_SYSTEM_MAP.md +206 -0
- package/docs/SERVER_OPTIMIZATION_NOTES.md +87 -0
- package/index.js +7 -1
- package/jerk2.5.webp +0 -0
- package/lib/admin/AdminExtension.js +436 -0
- package/lib/admin/ModuleLoader.js +77 -0
- package/lib/admin/config.js +21 -0
- package/lib/admin/modules/CacheModule.js +145 -0
- package/lib/admin/modules/STATS_MODULE_README.md +98 -0
- package/lib/admin/modules/StatsModule.js +140 -0
- package/lib/admin/modules/SystemModule.js +140 -0
- package/lib/admin/modules/TimeModule.js +95 -0
- package/lib/cache/CacheHooks.js +141 -0
- package/lib/core/server.js +199 -46
- package/lib/middleware/session.js +11 -3
- package/lib/mvc/viewEngine.js +26 -1
- package/lib/router/RouteMatcher.js +242 -54
- package/lib/utils/globalStats.js +16 -0
- package/package.json +2 -2
- package/@qaLoadModel/controllers/ProductController.js +0 -143
- package/@qaLoadModel/controllers/UserController.js +0 -143
- package/@qaLoadModel/models/ProductModel.js +0 -41
- package/@qaLoadModel/models/UserModel.js +0 -41
- package/@qaLoadModel/package.json +0 -22
- package/@qaLoadModel/qa_report.md +0 -71
- package/@qaLoadModel/results.md +0 -97
- package/@qaLoadModel/routes.json +0 -58
- package/@qaLoadModel/server.js +0 -43
- package/@qaLoadModel/simple-test.js +0 -96
- package/@qaLoadModel/test-models.js +0 -144
- package/@qaLoadModel/test_endpoints.sh +0 -35
- package/@qaLoadModel/test_final.js +0 -89
- package/@qaLoadModel/views/products/index.html +0 -45
- package/@qaLoadModel/views/products/show.html +0 -27
- package/@qaLoadModel/views/users/index.html +0 -44
- package/@qaLoadModel/views/users/show.html +0 -26
- package/qa/INFORME_QA_JERKJS_ROUTING.md +0 -108
- package/qa/informe_qa_fix_enrutamiento.md +0 -93
- package/qa-app/controllers/homeController.js +0 -9
- package/qa-app/controllers/userController.js +0 -76
- package/qa-app/hooks-config.js +0 -65
- package/qa-app/models/UserModel.js +0 -36
- package/qa-app/package-lock.json +0 -1683
- package/qa-app/package.json +0 -25
- package/qa-app/public/css/style.css +0 -15
- package/qa-app/public/images/logo.png +0 -3
- package/qa-app/public/index.html +0 -15
- package/qa-app/public/js/main.js +0 -7
- package/qa-app/routes/api-routes.json +0 -23
- package/qa-app/routes/page-routes.json +0 -16
- package/qa-app/routes/static-routes.json +0 -20
- package/qa-app/server.js +0 -68
- package/qa-app/views/footer.html +0 -3
- package/qa-app/views/index.html +0 -20
- package/qa-app/views/users.html +0 -20
- package/utils/find_file_path.sh +0 -36
- /package/{doc2.5.3 → doc-2.5}/manual-mvc-completo.md +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Mapa de Procesos de Caché del Framework JERK
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Este documento describe los diferentes sistemas de caché implementados en el framework JERK y cómo se integran en los flujos del sistema.
|
|
6
|
+
|
|
7
|
+
## Sistemas de Caché
|
|
8
|
+
|
|
9
|
+
### 1. Caché de Expresiones Regulares para Rutas (RouteMatcher)
|
|
10
|
+
|
|
11
|
+
**Ubicación**: `lib/router/RouteMatcher.js`
|
|
12
|
+
**Tipo**: Mapa de caché (Map)
|
|
13
|
+
**Propósito**: Almacenar expresiones regulares compiladas para rutas parametrizadas
|
|
14
|
+
**Clave**: Ruta con parámetros (ej. `/users/:id`)
|
|
15
|
+
**Valor**: Expresión regular compilada
|
|
16
|
+
**Flujo de proceso**:
|
|
17
|
+
1. Al procesar una ruta parametrizada, se convierte a expresión regular
|
|
18
|
+
2. Antes de compilar, se verifica si ya existe en el cache
|
|
19
|
+
3. Si existe, se devuelve la expresión regular cacheada
|
|
20
|
+
4. Si no existe, se compila, se almacena en cache y se devuelve
|
|
21
|
+
|
|
22
|
+
**Beneficios**:
|
|
23
|
+
- Evita compilación repetida de expresiones regulares
|
|
24
|
+
- Mejora el rendimiento de coincidencia de rutas parametrizadas
|
|
25
|
+
- Reduce el uso de CPU en operaciones repetidas
|
|
26
|
+
|
|
27
|
+
### 2. Caché de Vistas (ViewEngine)
|
|
28
|
+
|
|
29
|
+
**Ubicación**: `lib/mvc/viewEngine.js`
|
|
30
|
+
**Tipo**: Mapa de caché (Map)
|
|
31
|
+
**Propósito**: Almacenar contenido de vistas ya procesadas (sin variables)
|
|
32
|
+
**Clave**: Ruta completa del archivo de vista
|
|
33
|
+
**Valor**: Contenido de la vista procesado (condiciones, bucles, etc. resueltos)
|
|
34
|
+
**Flujo de proceso**:
|
|
35
|
+
1. Al solicitar una vista, se verifica si está en cache
|
|
36
|
+
2. Si está en cache, se procesa con las variables y se devuelve
|
|
37
|
+
3. Si no está en cache, se lee el archivo, se procesa (condiciones, bucles, etc.)
|
|
38
|
+
4. Si el cache está habilitado, se almacena la vista procesada (sin variables)
|
|
39
|
+
5. Se procesan las variables y se devuelve el resultado
|
|
40
|
+
|
|
41
|
+
**Beneficios**:
|
|
42
|
+
- Evita lectura repetida de archivos de vistas
|
|
43
|
+
- Evita procesamiento repetido de condiciones y bucles
|
|
44
|
+
- Mejora el rendimiento de renderizado de vistas
|
|
45
|
+
|
|
46
|
+
### 3. Caché de Controladores (ControllerLoader)
|
|
47
|
+
|
|
48
|
+
**Ubicación**: `lib/loader/controllerLoader.js`
|
|
49
|
+
**Tipo**: Sistema de caché de módulos de Node.js
|
|
50
|
+
**Propósito**: Evitar recarga repetida de módulos de controladores
|
|
51
|
+
**Clave**: Ruta del archivo del controlador
|
|
52
|
+
**Valor**: Instancia del módulo del controlador
|
|
53
|
+
**Flujo de proceso**:
|
|
54
|
+
1. Al cargar un controlador, se verifica si ya está en el cache de require
|
|
55
|
+
2. Si no está en cache, se carga y se mantiene en require.cache
|
|
56
|
+
3. En subsiguientes solicitudes, se devuelve la instancia cacheada
|
|
57
|
+
|
|
58
|
+
**Beneficios**:
|
|
59
|
+
- Evita recarga repetida de módulos
|
|
60
|
+
- Mejora el rendimiento de carga de controladores
|
|
61
|
+
- Reduce el uso de memoria
|
|
62
|
+
|
|
63
|
+
### 4. Índices de Rutas (RouteMatcher)
|
|
64
|
+
|
|
65
|
+
**Ubicación**: `lib/router/RouteMatcher.js`
|
|
66
|
+
**Tipo**: Mapas de índices y estructuras de datos
|
|
67
|
+
**Propósito**: Optimizar la búsqueda de rutas mediante pre-filtrado
|
|
68
|
+
**Componentes**:
|
|
69
|
+
- `exactRoutes`: Mapa de rutas exactas por método y path
|
|
70
|
+
- `routeBuckets`: Estructura jerárquica por método, número de segmentos y primer segmento
|
|
71
|
+
- `indexesValid`: Bandera para validar si los índices están actualizados
|
|
72
|
+
|
|
73
|
+
**Flujo de proceso**:
|
|
74
|
+
1. Al registrar rutas, se actualizan los índices
|
|
75
|
+
2. Al buscar una ruta, se usan los índices para pre-filtrar candidatos
|
|
76
|
+
3. Se buscan coincidencias exactas primero (más rápido)
|
|
77
|
+
4. Se buscan rutas parametrizadas solo entre candidatos filtrados
|
|
78
|
+
5. Se buscan rutas estáticas por prefijo entre candidatos filtrados
|
|
79
|
+
|
|
80
|
+
**Beneficios**:
|
|
81
|
+
- Reduce drásticamente el número de rutas a evaluar
|
|
82
|
+
- Mejora el rendimiento de coincidencia de rutas
|
|
83
|
+
- Escala mejor con un gran número de rutas
|
|
84
|
+
|
|
85
|
+
## Flujos de Integración de Caché
|
|
86
|
+
|
|
87
|
+
### Flujo de Procesamiento de Solicitudes
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
Solicitud HTTP
|
|
91
|
+
↓
|
|
92
|
+
Middleware de seguridad
|
|
93
|
+
↓
|
|
94
|
+
Verificación de índices de rutas (RouteMatcher)
|
|
95
|
+
↓
|
|
96
|
+
→ Búsqueda por ruta exacta (más rápida)
|
|
97
|
+
↓
|
|
98
|
+
→ Pre-filtrado por número de segmentos y primer segmento
|
|
99
|
+
↓
|
|
100
|
+
→ Búsqueda en rutas candidatas
|
|
101
|
+
↓
|
|
102
|
+
→ Coincidencia con expresiones regulares (usando cache)
|
|
103
|
+
↓
|
|
104
|
+
Ejecución del handler de la ruta
|
|
105
|
+
↓
|
|
106
|
+
Renderizado de vista (usando cache de vistas)
|
|
107
|
+
↓
|
|
108
|
+
Respuesta HTTP
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Flujo de Caché de Expresiones Regulares
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Solicitud de coincidencia de ruta parametrizada
|
|
115
|
+
↓
|
|
116
|
+
→ ¿Está la expresión regular en cache?
|
|
117
|
+
↓
|
|
118
|
+
┌─────────────┬─────────────┐
|
|
119
|
+
│ SÍ │ NO │
|
|
120
|
+
│ │ │
|
|
121
|
+
│ Devolver │ Compilar │
|
|
122
|
+
│ regex │ expresión │
|
|
123
|
+
│ cacheada │ regular │
|
|
124
|
+
│ │ │
|
|
125
|
+
└─────────────┴─────────────┘
|
|
126
|
+
↓
|
|
127
|
+
Almacenar en cache
|
|
128
|
+
↓
|
|
129
|
+
Usar para coincidencia
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Flujo de Caché de Vistas
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
Solicitud de renderizado de vista
|
|
136
|
+
↓
|
|
137
|
+
→ ¿Está la vista en cache?
|
|
138
|
+
↓
|
|
139
|
+
┌─────────────┬─────────────┐
|
|
140
|
+
│ SÍ │ NO │
|
|
141
|
+
│ │ │
|
|
142
|
+
│ Procesar │ Leer archivo│
|
|
143
|
+
│ con vars │ de vista │
|
|
144
|
+
│ │ │
|
|
145
|
+
│ Devolver │ Procesar │
|
|
146
|
+
│ resultado │ condiciónes,│
|
|
147
|
+
│ │ bucles, etc.│
|
|
148
|
+
│ │ │
|
|
149
|
+
│ │ → ¿Cache │
|
|
150
|
+
│ │ habilitado?│
|
|
151
|
+
│ │ ↓ │
|
|
152
|
+
│ │ ┌─────────┼─┐
|
|
153
|
+
│ │ │ SÍ │ │
|
|
154
|
+
│ │ │ │ │
|
|
155
|
+
│ │ │ Almacenar││
|
|
156
|
+
│ │ │ vista en ││
|
|
157
|
+
│ │ │ cache ││
|
|
158
|
+
│ │ └─────────┼─┘
|
|
159
|
+
│ │ │
|
|
160
|
+
└─────────────┴─────────────┘
|
|
161
|
+
↓
|
|
162
|
+
Devolver HTML renderizado
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Estrategias de Invalidación de Caché
|
|
166
|
+
|
|
167
|
+
### Caché de Expresiones Regulares
|
|
168
|
+
- No requiere invalidación frecuente
|
|
169
|
+
- Se actualiza automáticamente al cambiar las rutas
|
|
170
|
+
|
|
171
|
+
### Caché de Vistas
|
|
172
|
+
- Se puede limpiar manualmente con `viewEngine.clearCache()`
|
|
173
|
+
- No se invalida automáticamente (diseñado para vistas estáticas)
|
|
174
|
+
|
|
175
|
+
### Caché de Controladores
|
|
176
|
+
- Se mantiene durante todo el ciclo de vida del proceso
|
|
177
|
+
- Se puede limpiar manualmente eliminando del `require.cache`
|
|
178
|
+
|
|
179
|
+
### Índices de Rutas
|
|
180
|
+
- Se actualizan automáticamente al registrar nuevas rutas
|
|
181
|
+
- Se invalidan si cambia el número total de rutas
|
|
182
|
+
|
|
183
|
+
## Beneficios del Sistema de Caché
|
|
184
|
+
|
|
185
|
+
1. **Mejora de Rendimiento**: Reducción significativa de operaciones repetidas
|
|
186
|
+
2. **Eficiencia de CPU**: Menos compilación de expresiones regulares y procesamiento de vistas
|
|
187
|
+
3. **Eficiencia de I/O**: Menos lecturas de disco para archivos de vistas
|
|
188
|
+
4. **Escalabilidad**: Mejor manejo de alto volumen de solicitudes
|
|
189
|
+
5. **Optimización de Memoria**: Reutilización de estructuras de datos ya procesadas
|
|
190
|
+
|
|
191
|
+
## Consideraciones de Seguridad
|
|
192
|
+
|
|
193
|
+
- Las cachés no almacenan datos sensibles de usuarios
|
|
194
|
+
- Las expresiones regulares cacheadas no contienen información de entrada del usuario
|
|
195
|
+
- Las vistas cacheadas no contienen datos de sesión o variables de usuario
|
|
196
|
+
- El sistema de caché no expone información interna del sistema
|
|
197
|
+
|
|
198
|
+
## Conclusión
|
|
199
|
+
|
|
200
|
+
El framework JERK implementa múltiples niveles de caché para optimizar el rendimiento:
|
|
201
|
+
- Caché de expresiones regulares para rutas parametrizadas
|
|
202
|
+
- Caché de vistas procesadas
|
|
203
|
+
- Índices optimizados para búsqueda de rutas
|
|
204
|
+
- Caché de módulos de controladores
|
|
205
|
+
|
|
206
|
+
Estos sistemas de caché trabajan juntos para proporcionar un rendimiento óptimo al minimizar operaciones repetidas y maximizar la eficiencia del procesamiento de solicitudes.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Personalización de Flags de Seguridad para Cookies de Sesión
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Desde la versión 2.5.5, el framework JERK permite la personalización de las flags de seguridad para las cookies de sesión a través del sistema de hooks y filtros. Esto permite a los desarrolladores implementar medidas de seguridad adicionales según sus necesidades específicas.
|
|
6
|
+
|
|
7
|
+
## Filtros Disponibles
|
|
8
|
+
|
|
9
|
+
El sistema de sesiones incluye dos filtros principales para la personalización de las flags de las cookies:
|
|
10
|
+
|
|
11
|
+
### 1. `session_cookie_flags`
|
|
12
|
+
|
|
13
|
+
Este filtro se aplica cuando se crea una nueva cookie de sesión. Permite modificar las flags que se aplican a la cookie cuando se establece por primera vez.
|
|
14
|
+
|
|
15
|
+
**Parámetros:**
|
|
16
|
+
- `defaultFlags` (string): Las flags predeterminadas de la cookie (`HttpOnly; Path=/`)
|
|
17
|
+
- `req` (object): El objeto de solicitud HTTP
|
|
18
|
+
- `res` (object): El objeto de respuesta HTTP
|
|
19
|
+
- `sessionId` (string): El ID de la sesión que se está creando
|
|
20
|
+
|
|
21
|
+
### 2. `session_cookie_destroy_flags`
|
|
22
|
+
|
|
23
|
+
Este filtro se aplica cuando se destruye una cookie de sesión. Permite modificar las flags que se aplican a la cookie cuando se borra.
|
|
24
|
+
|
|
25
|
+
**Parámetros:**
|
|
26
|
+
- `defaultFlags` (string): Las flags predeterminadas de la cookie destruida (`HttpOnly; Path=/`)
|
|
27
|
+
- `req` (object): El objeto de solicitud HTTP
|
|
28
|
+
- `res` (object): El objeto de respuesta HTTP
|
|
29
|
+
- `sessionId` (string): El ID de la sesión que se está destruyendo
|
|
30
|
+
|
|
31
|
+
## Uso Básico
|
|
32
|
+
|
|
33
|
+
### Ejemplo Simple
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
const { hooks } = require('jerkjs');
|
|
37
|
+
|
|
38
|
+
// Añadir SameSite=Lax a todas las cookies de sesión
|
|
39
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
40
|
+
return defaultFlags + '; SameSite=Lax';
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Añadir SameSite=Lax a las cookies de sesión cuando se destruyen
|
|
44
|
+
hooks.addFilter('session_cookie_destroy_flags', (defaultFlags, req, res, sessionId) => {
|
|
45
|
+
return defaultFlags + '; SameSite=Lax';
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Ejemplo Avanzado con Detección de HTTPS
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
const { hooks } = require('jerkjs');
|
|
53
|
+
|
|
54
|
+
// Personalizar flags basadas en el protocolo de la solicitud
|
|
55
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
56
|
+
// Detectar si la solicitud es HTTPS (para entornos reales o proxy)
|
|
57
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
58
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
59
|
+
|
|
60
|
+
let flags = defaultFlags;
|
|
61
|
+
|
|
62
|
+
// Agregar la flag Secure si es HTTPS
|
|
63
|
+
if (isHttps) {
|
|
64
|
+
flags += '; Secure';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Agregar SameSite según el contexto
|
|
68
|
+
flags += '; SameSite=Lax';
|
|
69
|
+
|
|
70
|
+
return flags;
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Aplicar la misma lógica al destruir la sesión
|
|
74
|
+
hooks.addFilter('session_cookie_destroy_flags', (defaultFlags, req, res, sessionId) => {
|
|
75
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
76
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
77
|
+
|
|
78
|
+
let flags = defaultFlags;
|
|
79
|
+
|
|
80
|
+
if (isHttps) {
|
|
81
|
+
flags += '; Secure';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
flags += '; SameSite=Lax';
|
|
85
|
+
|
|
86
|
+
return flags;
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Flags de Seguridad Comunes
|
|
91
|
+
|
|
92
|
+
### Flags ya implementadas
|
|
93
|
+
|
|
94
|
+
- **HttpOnly**: Previene ataques de secuestro de sesión mediante XSS
|
|
95
|
+
- **Secure**: Asegura que la cookie solo se transmita a través de conexiones HTTPS
|
|
96
|
+
- **SameSite**: Previene ataques de falsificación de solicitudes entre sitios (CSRF)
|
|
97
|
+
|
|
98
|
+
### Flags adicionales disponibles
|
|
99
|
+
|
|
100
|
+
- **Partitioned**: Proporciona una capa adicional de protección contra ataques de secuestro de sesión, especialmente en contextos de terceros. Compatible con `SameSite`.
|
|
101
|
+
|
|
102
|
+
### Ejemplo con Partitioned
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
106
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
107
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
108
|
+
|
|
109
|
+
let flags = defaultFlags;
|
|
110
|
+
|
|
111
|
+
if (isHttps) {
|
|
112
|
+
flags += '; Secure';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// SameSite=Lax es generalmente recomendado para sesiones
|
|
116
|
+
flags += '; SameSite=Lax';
|
|
117
|
+
|
|
118
|
+
// Partitioned es opcional y depende del contexto de uso
|
|
119
|
+
// Solo se recomienda en ciertos escenarios específicos
|
|
120
|
+
// flags += '; Partitioned'; // Descomentar si se requiere
|
|
121
|
+
|
|
122
|
+
return flags;
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Consideraciones de Seguridad
|
|
127
|
+
|
|
128
|
+
### SameSite Options
|
|
129
|
+
|
|
130
|
+
- `SameSite=Strict`: La cookie solo se envía en contextos de primer nivel (mismo sitio)
|
|
131
|
+
- `SameSite=Lax`: La cookie se envía en solicitudes de navegación de alto nivel (links, etc.)
|
|
132
|
+
- `SameSite=None`: La cookie se envía en todos los contextos (requiere Secure)
|
|
133
|
+
|
|
134
|
+
### Recomendaciones
|
|
135
|
+
|
|
136
|
+
- Siempre usar `Secure` en entornos HTTPS
|
|
137
|
+
- Usar `SameSite=Lax` para la mayoría de los casos de sesión
|
|
138
|
+
- Considerar `SameSite=Strict` para operaciones sensibles
|
|
139
|
+
- `Partitioned` es experimental y debe usarse con precaución
|
|
140
|
+
|
|
141
|
+
## Ejemplos de Configuraciones Comunes
|
|
142
|
+
|
|
143
|
+
### Entorno de Producción (HTTPS)
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
147
|
+
return defaultFlags + '; Secure; SameSite=Strict';
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Aplicación con Subdominios
|
|
152
|
+
|
|
153
|
+
```javascript
|
|
154
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
155
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
156
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
157
|
+
|
|
158
|
+
let flags = defaultFlags;
|
|
159
|
+
|
|
160
|
+
if (isHttps) {
|
|
161
|
+
flags += '; Secure';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Para aplicaciones con subdominios, SameSite=None puede ser necesario
|
|
165
|
+
// Pero requiere la flag Secure
|
|
166
|
+
flags += '; SameSite=None';
|
|
167
|
+
|
|
168
|
+
return flags;
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Conclusión
|
|
173
|
+
|
|
174
|
+
El sistema de filtros para las cookies de sesión proporciona una forma flexible y potente de personalizar las flags de seguridad según las necesidades específicas de cada aplicación. Esto mejora significativamente la seguridad del sistema de sesiones en comparación con la implementación predeterminada.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Análisis Completo del Framework JERK
|
|
2
|
+
|
|
3
|
+
## Descripción General
|
|
4
|
+
|
|
5
|
+
JERK es un framework de desarrollo web completo para Node.js que implementa una arquitectura MVC (Modelo-Vista-Controlador) con soporte para APIs REST, seguridad avanzada, y sistemas de plantillas. La versión actual es 2.5.4.
|
|
6
|
+
|
|
7
|
+
## Arquitectura General
|
|
8
|
+
|
|
9
|
+
El framework está estructurado en componentes modulares que se comunican entre sí a través de un sistema de hooks y filtros, permitiendo una alta extensibilidad y personalización.
|
|
10
|
+
|
|
11
|
+
## Componentes Principales
|
|
12
|
+
|
|
13
|
+
### 1. Servidor Principal (APIServer)
|
|
14
|
+
|
|
15
|
+
- Implementa un servidor HTTP/HTTPS básico con soporte para rutas parametrizadas
|
|
16
|
+
- Incluye manejo de archivos estáticos con soporte para índices y control de caché
|
|
17
|
+
- Tiene integración con sistema de hooks para extensibilidad
|
|
18
|
+
- Soporta middlewares y manejo de cuerpos de solicitud con límites de tamaño
|
|
19
|
+
|
|
20
|
+
### 2. Sistema de Enrutamiento
|
|
21
|
+
|
|
22
|
+
- **Router**: Sistema de enrutamiento avanzado con soporte para rutas anidadas
|
|
23
|
+
- **RouteMatcher**: Componente especializado para coincidencia de rutas parametrizadas con cacheo de expresiones regulares
|
|
24
|
+
- Soporta rutas estáticas y dinámicas con prioridad adecuada
|
|
25
|
+
|
|
26
|
+
### 3. Middleware
|
|
27
|
+
|
|
28
|
+
- **CORS**: Middleware para configuración de políticas de recursos cruzados
|
|
29
|
+
- **Authenticator**: Sistema de autenticación con múltiples estrategias (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect)
|
|
30
|
+
- **Session**: Sistema de sesiones con almacenamiento en memoria y cookies seguras
|
|
31
|
+
- **Validator**: Validador de esquemas para solicitudes HTTP
|
|
32
|
+
- **RateLimiter**: Limitador de tasa con almacenamiento en memoria o Redis
|
|
33
|
+
- **Compressor**: Middleware de compresión (gzip/deflate) con sistema de hooks
|
|
34
|
+
- **Firewall**: Web Application Firewall (WAF) con detección de patrones de ataque
|
|
35
|
+
- **AuditLogger**: Sistema de auditoría para eventos de seguridad
|
|
36
|
+
|
|
37
|
+
### 4. Componentes MVC
|
|
38
|
+
|
|
39
|
+
- **ControllerBase**: Controlador base con soporte para vistas, layouts y variables
|
|
40
|
+
- **ModelBase**: Clase base para modelos con operaciones CRUD
|
|
41
|
+
- **ViewEngine**: Motor de plantillas profesional con soporte para filtros, helpers, condiciones, bucles e inclusiones
|
|
42
|
+
- **ModelManager**: Gestor de modelos con soporte para múltiples adaptadores
|
|
43
|
+
- **Adaptadores**: Soporte para diferentes motores de base de datos (Memory, MariaDB/MySQL, SQLite)
|
|
44
|
+
|
|
45
|
+
### 5. Sistema de Seguridad
|
|
46
|
+
|
|
47
|
+
- **SecurityEnhancedServer**: Servidor con funcionalidades de seguridad avanzada (WAF)
|
|
48
|
+
- **Firewall**: Sistema de firewall con listas blancas/negras y reglas personalizadas
|
|
49
|
+
- **TokenManager**: Gestión de tokens JWT con diferentes tipos de almacenamiento
|
|
50
|
+
- **AttackDetector**: Detector de patrones de ataque (SQL Injection, XSS, etc.)
|
|
51
|
+
|
|
52
|
+
### 6. Sistema de Hooks
|
|
53
|
+
|
|
54
|
+
- Implementación completa del sistema de hooks y filtros similar al de WordPress
|
|
55
|
+
- Permite extensibilidad en todos los componentes del framework
|
|
56
|
+
- Soporta namespaces y prioridades para los hooks
|
|
57
|
+
|
|
58
|
+
### 7. Sistemas de Carga
|
|
59
|
+
|
|
60
|
+
- **RouteLoader**: Carga de rutas desde archivos JSON
|
|
61
|
+
- **RouteDirectoryLoader**: Carga de rutas desde múltiples archivos JSON en un directorio
|
|
62
|
+
- **ControllerLoader**: Carga dinámica de controladores desde archivos
|
|
63
|
+
|
|
64
|
+
### 8. Utilidades
|
|
65
|
+
|
|
66
|
+
- **Logger**: Sistema de logging estructurado con diferentes niveles y formatos
|
|
67
|
+
- **ErrorHandler**: Manejo centralizado de errores con soporte para diferentes tipos de excepciones
|
|
68
|
+
- **ConfigParser**: Parser de configuración desde archivos JSON y variables de entorno
|
|
69
|
+
- **MimeType**: Sistema de detección de tipos MIME
|
|
70
|
+
|
|
71
|
+
## Características Destacadas
|
|
72
|
+
|
|
73
|
+
1. **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
|
|
74
|
+
2. **Seguridad Avanzada**: Múltiples capas de seguridad incluyendo WAF
|
|
75
|
+
3. **Sistema de Hooks**: Extensibilidad similar al sistema de WordPress
|
|
76
|
+
4. **Autenticación Flexible**: Soporte para múltiples métodos de autenticación
|
|
77
|
+
5. **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
|
|
78
|
+
6. **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
|
|
79
|
+
7. **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
|
|
80
|
+
8. **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
|
|
81
|
+
9. **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
|
|
82
|
+
10. **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
|
|
83
|
+
11. **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos
|
|
84
|
+
12. **Compatible con qbuilderjs**: Integración con QueryBuilder externo para construir consultas SQL
|
|
85
|
+
|
|
86
|
+
## Estructura de Directorios
|
|
87
|
+
|
|
88
|
+
- `lib/`: Código fuente principal del framework
|
|
89
|
+
- `core/`: Componentes fundamentales (servidor, router, hooks)
|
|
90
|
+
- `loader/`: Componentes de carga (rutas, controladores)
|
|
91
|
+
- `middleware/`: Middlewares de seguridad y funcionalidad
|
|
92
|
+
- `mvc/`: Componentes MVC (controladores, modelos, vistas)
|
|
93
|
+
- `router/`: Componentes de enrutamiento
|
|
94
|
+
- `utils/`: Utilidades (logging, manejo de errores, etc.)
|
|
95
|
+
|
|
96
|
+
## Dependencias
|
|
97
|
+
|
|
98
|
+
- `bcrypt`: Para hashing de contraseñas
|
|
99
|
+
- `jsonwebtoken`: Para tokens JWT
|
|
100
|
+
- `mariadb`: Para conexión con bases de datos MariaDB/MySQL
|
|
101
|
+
- `sqlite3`: Para conexión con bases de datos SQLite
|
|
102
|
+
- `qbuilderjs`: Para construcción de consultas SQL seguras
|
|
103
|
+
|
|
104
|
+
## Patrones de Diseño
|
|
105
|
+
|
|
106
|
+
- **Singleton**: Para componentes centrales como el sistema de hooks
|
|
107
|
+
- **Factory**: Para creación de instancias de modelos y adaptadores
|
|
108
|
+
- **Strategy**: Para diferentes estrategias de autenticación
|
|
109
|
+
- **Observer**: A través del sistema de hooks para extensibilidad
|
|
110
|
+
- **MVC**: Arquitectura modelo-vista-controlador para la separación de responsabilidades
|
|
111
|
+
|
|
112
|
+
## Funcionalidades Avanzadas
|
|
113
|
+
|
|
114
|
+
### Sistema de Hooks y Filtros
|
|
115
|
+
|
|
116
|
+
El framework incluye un sistema completo de hooks y filtros similar al de WordPress, que permite extender la funcionalidad en diferentes puntos del ciclo de vida de la aplicación:
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
const { hooks } = require('jerkjs');
|
|
120
|
+
|
|
121
|
+
// Registrar una acción
|
|
122
|
+
hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
|
|
123
|
+
console.log(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Registrar un filtro
|
|
127
|
+
hooks.addFilter('session_create_data', (userData, req) => {
|
|
128
|
+
return {
|
|
129
|
+
...userData,
|
|
130
|
+
ipAddress: req.headers['x-forwarded-for'] || req.connection.remoteAddress,
|
|
131
|
+
createdAt: new Date().toISOString()
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Motor de Plantillas
|
|
137
|
+
|
|
138
|
+
El motor de plantillas profesional incluye soporte para:
|
|
139
|
+
|
|
140
|
+
- Variables: `{{variable}}`
|
|
141
|
+
- Condiciones: `{{if variable}}contenido{{endif}}`
|
|
142
|
+
- Bucles: `{{foreach:array}}contenido{{endforeach}}`
|
|
143
|
+
- Inclusiones: `{{include:header}}`
|
|
144
|
+
- Filtros: `{{variable|upper}}`
|
|
145
|
+
- Helpers personalizados
|
|
146
|
+
|
|
147
|
+
### Sistema de Modelos
|
|
148
|
+
|
|
149
|
+
La arquitectura de modelos completa permite:
|
|
150
|
+
|
|
151
|
+
- Encapsular la lógica de negocio y el acceso a datos
|
|
152
|
+
- Utilizar diferentes adaptadores de base de datos
|
|
153
|
+
- Implementar operaciones CRUD estándar
|
|
154
|
+
- Extender con métodos personalizados
|
|
155
|
+
|
|
156
|
+
## Conclusión
|
|
157
|
+
|
|
158
|
+
Este framework está diseñado para proporcionar una solución completa para el desarrollo de aplicaciones web seguras y escalables, con una arquitectura modular que permite extender su funcionalidad a través del sistema de hooks y una sólida capa de seguridad que incluye WAF, autenticación multifactor y protección contra ataques comunes.
|
|
159
|
+
|
|
160
|
+
La arquitectura modular y el sistema de hooks hacen que JERK sea altamente personalizable y adaptable a diferentes necesidades de desarrollo, mientras que su enfoque en la seguridad y el patrón MVC proporcionan una base sólida para construir aplicaciones robustas y mantenibles.
|
|
161
|
+
|
|
162
|
+
## Consideraciones de Seguridad Adicionales
|
|
163
|
+
|
|
164
|
+
### Seguridad de Cookies en el Sistema de Sesiones
|
|
165
|
+
|
|
166
|
+
Tras un análisis detallado del código de JERK Framework, se ha identificado que el sistema de sesiones implementado en `lib/middleware/session.js` presenta algunas deficiencias en cuanto a la seguridad de las cookies:
|
|
167
|
+
|
|
168
|
+
#### Flags de Seguridad Implementadas:
|
|
169
|
+
|
|
170
|
+
1. **HttpOnly**:
|
|
171
|
+
- Esta flag está presente en ambas configuraciones de cookie (creación y destrucción)
|
|
172
|
+
- **Propósito**: Previene ataques de secuestro de sesión mediante XSS (Cross-Site Scripting)
|
|
173
|
+
- **Funcionamiento**: Impide que el código JavaScript del lado del cliente acceda al valor de la cookie a través de document.cookie
|
|
174
|
+
- **Implementación en JERK**: Se aplica sistemáticamente en todas las operaciones de cookie de sesión
|
|
175
|
+
|
|
176
|
+
#### Flags de Seguridad Ausentes:
|
|
177
|
+
|
|
178
|
+
2. **Secure**:
|
|
179
|
+
- **NO ESTÁ IMPLEMENTADA** en la configuración actual de cookies en JERK
|
|
180
|
+
- **Propósito**: Asegura que la cookie solo se transmita a través de conexiones HTTPS cifradas
|
|
181
|
+
- **Importancia**: Crítica para prevenir el robo de cookies en redes inseguras
|
|
182
|
+
- **Falta en JERK**: El framework no incluye esta flag, lo que representa un riesgo de seguridad en entornos HTTPS
|
|
183
|
+
|
|
184
|
+
3. **SameSite**:
|
|
185
|
+
- **NO ESTÁ IMPLEMENTADA** en la configuración actual de cookies en JERK
|
|
186
|
+
- **Propósito**: Previene ataques de falsificación de solicitudes entre sitios (CSRF)
|
|
187
|
+
- **Valores posibles**:
|
|
188
|
+
- `Strict`: La cookie solo se envía en contextos de primer nivel (mismo sitio)
|
|
189
|
+
- `Lax`: La cookie se envía en solicitudes de navegación de alto nivel (links, etc.)
|
|
190
|
+
- `None`: La cookie se envía en todos los contextos (requiere Secure)
|
|
191
|
+
- **Importancia**: Fundamental para la protección contra CSRF
|
|
192
|
+
- **Falta en JERK**: El framework no incluye esta protección
|
|
193
|
+
|
|
194
|
+
#### Recomendaciones de Mejora:
|
|
195
|
+
|
|
196
|
+
Para mejorar la seguridad del sistema de sesiones, se deberían considerar las siguientes modificaciones:
|
|
197
|
+
|
|
198
|
+
1. **Agregar detección automática de HTTPS**:
|
|
199
|
+
```javascript
|
|
200
|
+
let cookieFlags = 'HttpOnly; Path=/';
|
|
201
|
+
if (req.connection.encrypted || req.headers['x-forwarded-proto'] === 'https') {
|
|
202
|
+
cookieFlags += '; Secure';
|
|
203
|
+
}
|
|
204
|
+
cookieFlags += '; SameSite=Lax';
|
|
205
|
+
res.setHeader('Set-Cookie', `${this.cookieName}=${newSessionId}; ${cookieFlags}; Max-Age=${this.timeout / 1000}`);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
2. **Permitir configuración personalizada**:
|
|
209
|
+
- Opciones para SameSite (Lax, Strict, None)
|
|
210
|
+
- Configuración de Path personalizable
|
|
211
|
+
- Soporte para dominios cruzados si es necesario
|
|
212
|
+
|
|
213
|
+
La implementación actual en JERK Framework proporciona la protección básica con HttpOnly, pero carece de las flags Secure y SameSite que son esenciales para una seguridad completa en aplicaciones web modernas. Estas deficiencias deben abordarse para cumplir con los estándares de seguridad actuales.
|