blackcoffee2 2.1.0
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/CHANGELOG.md +664 -0
- package/LICENSE +201 -0
- package/NOTICE +25 -0
- package/README.md +246 -0
- package/apps.zip +0 -0
- package/bin/adminclient +105 -0
- package/bin/blackcoffee +133 -0
- package/cli/admin-users.js +282 -0
- package/cli/commands/app.js +561 -0
- package/cli/commands/config.js +182 -0
- package/cli/commands/db.js +257 -0
- package/cli/commands/server.js +200 -0
- package/config/applications.json +5 -0
- package/config/database.json +28 -0
- package/config/database.json.example +23 -0
- package/config/server.json +32 -0
- package/controllers/admin/AdminController.js +529 -0
- package/controllers/admin/AdminViewController.js +90 -0
- package/controllers/admin/AuthController.js +293 -0
- package/controllers/admin/DatabaseAdminController.js +218 -0
- package/core/SQLiteAdapter.js +333 -0
- package/core/appLoader.js +385 -0
- package/core/databasePoolManager.js +431 -0
- package/core/hotReload.js +363 -0
- package/data/ADMIN-README.md +145 -0
- package/data/CHANGELOG.md +48 -0
- package/data/GTK3-NODE-PROPOSALS.md +410 -0
- package/data/admin-db.js +150 -0
- package/data/admin-gui.js +452 -0
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/data/migrations/001_create_admin_users.sql +33 -0
- package/docs/APP_HOOKS_HANDLER.md +432 -0
- package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
- package/docs/ARCHITECTURE.md +435 -0
- package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
- package/docs/EVENTS_APP_MANUAL.md +289 -0
- package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
- package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
- package/docs/ROADMAP.md +242 -0
- package/docs/ROADMAP.md.backup +243 -0
- package/includes/404-hooks.js +423 -0
- package/includes/adminAuth.js +214 -0
- package/includes/adminExtension.js +53 -0
- package/includes/appHooks.js +302 -0
- package/includes/initAdminDb.js +115 -0
- package/includes/routeLoader.js +67 -0
- package/includes/sessions.js +223 -0
- package/issues/001-duplicate-module-loading.md +92 -0
- package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
- package/manuales/CACHE_SYSTEM_MAP.md +206 -0
- package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
- package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
- package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
- package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
- package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
- package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
- package/manuales/WAF_MODULE_MANUAL.md +229 -0
- package/manuales/after_route_handler_filter_example.md +116 -0
- package/manuales/after_route_handler_usage.md +130 -0
- package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
- package/manuales/async_hooks_promises_guide.md +325 -0
- package/manuales/before_route_handler_filter_example.md +97 -0
- package/manuales/before_route_handler_usage.md +122 -0
- package/manuales/hooks_chaining_conditions_guide.md +261 -0
- package/manuales/hooks_filters_documentation.md +493 -0
- package/manuales/hooks_filters_documentation_en.md +493 -0
- package/manuales/hooks_vs_middlewares_comparison.md +87 -0
- package/manuales/manual-mvc-completo.md +934 -0
- package/manuales/modulos_administracion.md +89 -0
- package/manuales/router_execution_points.md +74 -0
- package/manuales/static_file_hooks_usage.md +222 -0
- package/models/AdminUserModel.js +132 -0
- package/package.json +45 -0
- package/programatically/PRoutes.js +89 -0
- package/programatically/initFlow.js +211 -0
- package/public/admin/css/db-pools.css +336 -0
- package/public/admin/css/styles.css +310 -0
- package/public/admin/database.html +312 -0
- package/public/admin/index.html +116 -0
- package/public/admin/js/app.js +470 -0
- package/public/admin/js/db-pools.js +253 -0
- package/public/admin/login.html +278 -0
- package/public/assets/css/styles.css +477 -0
- package/public/assets/js/main.js +89 -0
- package/public/index.html +136 -0
- package/public/templates/404.html +158 -0
- package/routes/admin-views.json +20 -0
- package/routes/admin.json +38 -0
- package/routes/auth.json +32 -0
- package/routes/static.json +18 -0
- package/server.js +299 -0
- package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
- package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
- package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
- package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
- package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
- package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
- package/test-aplicacion.con-logisession/controllers/example.js +183 -0
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
- package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
- package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
- package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
- package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/package-lock.json +3313 -0
- package/test-aplicacion.con-logisession/package.json +32 -0
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
- package/test-aplicacion.con-logisession/public/css/style.css +64 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
- package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
- package/test-aplicacion.con-logisession/public/js/main.js +67 -0
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
- package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
- package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
- package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
- package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
- package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
- package/test-aplicacion.con-logisession/views/products/index.html +39 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Manual del Módulo WAF (Web Application Firewall) para Insitu Framework
|
|
2
|
+
|
|
3
|
+
## Tabla de Contenidos
|
|
4
|
+
1. [Introducción](#introducción)
|
|
5
|
+
2. [Características del WAF](#características-del-waf)
|
|
6
|
+
3. [Comandos Disponibles](#comandos-disponibles)
|
|
7
|
+
4. [Estadísticas del Servidor](#estadísticas-del-servidor)
|
|
8
|
+
5. [Gestión de Reglas X-Headers](#gestión-de-reglas-x-headers)
|
|
9
|
+
6. [Listas de IPs](#listas-de-ips)
|
|
10
|
+
7. [Persistencia de Reglas](#persistencia-de-reglas)
|
|
11
|
+
8. [Ejemplos de Uso](#ejemplos-de-uso)
|
|
12
|
+
|
|
13
|
+
## Introducción
|
|
14
|
+
|
|
15
|
+
El módulo WAF (Web Application Firewall) es una extensión de la extensión de administración de Insitu Framework que permite monitorear, gestionar y proteger tu aplicación web. Proporciona estadísticas en tiempo real, gestión de reglas de seguridad y control de acceso basado en headers X-.
|
|
16
|
+
|
|
17
|
+
## Características del WAF
|
|
18
|
+
|
|
19
|
+
- **Estadísticas en tiempo real**: Conteo de solicitudes procesadas y respuestas enviadas con medición en kilobytes
|
|
20
|
+
- **Monitoreo de tráfico**: Registro de accesos a rutas y endpoints
|
|
21
|
+
- **Sistema de reglas X-Headers**: Bloqueo basado en headers como X-Forwarded-For, X-Real-IP, etc.
|
|
22
|
+
- **Listas de IPs**: Sistema de whitelist (nunca bloqueadas) y blacklist (siempre bloqueadas)
|
|
23
|
+
- **Persistencia**: Guardado y carga de reglas de seguridad
|
|
24
|
+
- **Interfaz interactiva**: Sistema de comandos para gestión en tiempo real
|
|
25
|
+
|
|
26
|
+
## Comandos Disponibles
|
|
27
|
+
|
|
28
|
+
### Comandos Generales de Estadísticas
|
|
29
|
+
- `waf-status` o `waf-stats`: Muestra estadísticas generales del servidor
|
|
30
|
+
- `waf-blocked` o `waf-security`: Muestra estadísticas de seguridad
|
|
31
|
+
- `waf-x-headers`: Muestra reglas de headers X- configuradas
|
|
32
|
+
|
|
33
|
+
### Comandos de Gestión de Reglas
|
|
34
|
+
- `create-x-rule`: Crea una nueva regla de seguridad basada en headers X-
|
|
35
|
+
- `remove-x-rule`: Remueve una regla de seguridad existente
|
|
36
|
+
- `save-rules`: Guarda todas las reglas a un archivo
|
|
37
|
+
- `load-rules`: Carga reglas desde un archivo
|
|
38
|
+
|
|
39
|
+
### Comandos de Gestión de IPs
|
|
40
|
+
- `waf-block-ip`: Bloquea temporalmente una IP
|
|
41
|
+
- `waf-unblock-ip`: Desbloquea una IP temporalmente bloqueada
|
|
42
|
+
- `waf-whitelist`: Agrega una IP a la lista blanca
|
|
43
|
+
- `waf-blacklist`: Agrega una IP a la lista negra
|
|
44
|
+
|
|
45
|
+
## Estadísticas del Servidor
|
|
46
|
+
|
|
47
|
+
### waf-status / waf-stats
|
|
48
|
+
Muestra las estadísticas generales del servidor:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
=== Estadísticas del WAF ===
|
|
52
|
+
Solicitudes procesadas: 15
|
|
53
|
+
Solicitudes procesadas (KB): 2.45 KB
|
|
54
|
+
Respuestas enviadas: 15
|
|
55
|
+
Respuestas enviadas (KB): 15.67 KB
|
|
56
|
+
IPs en lista blanca: 2
|
|
57
|
+
IPs en lista negra: 1
|
|
58
|
+
Reglas de seguridad activas: 3
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Campos de Estadísticas
|
|
62
|
+
- **Solicitudes procesadas**: Número total de solicitudes HTTP procesadas
|
|
63
|
+
- **Solicitudes procesadas (KB)**: Cantidad total de datos recibidos en kilobytes
|
|
64
|
+
- **Respuestas enviadas**: Número total de respuestas HTTP enviadas
|
|
65
|
+
- **Respuestas enviadas (KB)**: Cantidad total de datos enviados en kilobytes
|
|
66
|
+
- **IPs en lista blanca**: Número de IPs que nunca serán bloqueadas
|
|
67
|
+
- **IPs en lista negra**: Número de IPs que siempre serán bloqueadas
|
|
68
|
+
- **Reglas de seguridad activas**: Número de reglas de seguridad activas
|
|
69
|
+
|
|
70
|
+
## Gestión de Reglas X-Headers
|
|
71
|
+
|
|
72
|
+
### Crear Regla (`create-x-rule`)
|
|
73
|
+
Proceso interactivo para crear reglas de seguridad basadas en headers X-:
|
|
74
|
+
|
|
75
|
+
1. **Nombre del header**: Introduce el nombre del header X- (ej: X-Forwarded-For, X-Real-IP)
|
|
76
|
+
2. **Patrón**: Introduce el patrón para coincidir (cadena o expresión regular)
|
|
77
|
+
3. **Acción**: Selecciona la acción a tomar:
|
|
78
|
+
- `1` o `block`: Bloquear solicitudes que coincidan
|
|
79
|
+
- `2` o `log`: Registrar solicitudes que coincidan
|
|
80
|
+
- `3` o `monitor`: Monitorear solicitudes que coincidan
|
|
81
|
+
4. **Razón**: Introduce la razón para la regla (opcional)
|
|
82
|
+
|
|
83
|
+
### Remover Regla (`remove-x-rule`)
|
|
84
|
+
Proceso interactivo para remover reglas existentes:
|
|
85
|
+
1. Se muestra una lista numerada de reglas disponibles
|
|
86
|
+
2. Introduce el número de la regla que deseas remover
|
|
87
|
+
3. La regla se elimina inmediatamente del sistema
|
|
88
|
+
|
|
89
|
+
## Listas de IPs
|
|
90
|
+
|
|
91
|
+
### Whitelist (`waf-whitelist`)
|
|
92
|
+
Agrega una IP a la lista blanca (nunca será bloqueada):
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
> waf-whitelist
|
|
96
|
+
Introduce la IP a agregar a la lista blanca (ej: 192.168.1.100):
|
|
97
|
+
> 192.168.1.100
|
|
98
|
+
IP 192.168.1.100 agregada a la lista blanca.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Blacklist (`waf-blacklist`)
|
|
102
|
+
Agrega una IP a la lista negra (siempre será bloqueada):
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
> waf-blacklist
|
|
106
|
+
Introduce la IP a agregar a la lista negra (ej: 10.0.0.100):
|
|
107
|
+
> 10.0.0.100
|
|
108
|
+
IP 10.0.0.100 agregada a la lista negra.
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Bloqueo Temporal (`waf-block-ip`)
|
|
112
|
+
Bloquea temporalmente una IP:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
> waf-block-ip
|
|
116
|
+
Introduce la IP a bloquear temporalmente (ej: 192.168.1.100):
|
|
117
|
+
> 192.168.1.200
|
|
118
|
+
IP 192.168.1.200 bloqueada temporalmente.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Persistencia de Reglas
|
|
122
|
+
|
|
123
|
+
### Guardar Reglas (`save-rules`)
|
|
124
|
+
Guarda todas las reglas de seguridad actuales a un archivo JSON:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
> save-rules
|
|
128
|
+
✅ Reglas guardadas exitosamente en: /path/to/waf-rules/waf-rules-timestamp.json
|
|
129
|
+
Total de reglas guardadas: 3
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Cargar Reglas (`load-rules`)
|
|
133
|
+
Carga reglas de seguridad desde un archivo JSON:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
> load-rules
|
|
137
|
+
=== Archivos de Reglas Disponibles ===
|
|
138
|
+
1. waf-rules-1770795262452.json
|
|
139
|
+
|
|
140
|
+
Introduce el número del archivo a cargar (o "cancel" para cancelar):
|
|
141
|
+
> 1
|
|
142
|
+
|
|
143
|
+
¿Deseas reemplazar las reglas actuales? (sí/no):
|
|
144
|
+
> sí
|
|
145
|
+
|
|
146
|
+
✅ Reglas cargadas exitosamente desde: /path/to/waf-rules/waf-rules-1770795262452.json
|
|
147
|
+
Total de reglas cargadas: 3
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Ejemplos de Uso
|
|
151
|
+
|
|
152
|
+
### Ejemplo 1: Crear Regla para Bloquear IPs Internas
|
|
153
|
+
```
|
|
154
|
+
> create-x-rule
|
|
155
|
+
=== Crear Regla de Header X- ===
|
|
156
|
+
Introduce el nombre del header X- (ej: X-Forwarded-For, X-Real-IP):
|
|
157
|
+
> X-Forwarded-For
|
|
158
|
+
Header seleccionado: X-Forwarded-For
|
|
159
|
+
Introduce el patrón para coincidir (cadena o expresión regular):
|
|
160
|
+
> 192.168.
|
|
161
|
+
Selecciona la acción a tomar:
|
|
162
|
+
1. block - Bloquear solicitudes que coincidan
|
|
163
|
+
2. log - Registrar solicitudes que coincidan
|
|
164
|
+
3. monitor - Monitorear solicitudes que coincidan
|
|
165
|
+
Escribe el número o el nombre de la acción:
|
|
166
|
+
> 1
|
|
167
|
+
Acción seleccionada: block
|
|
168
|
+
Introduce la razón para la regla (opcional):
|
|
169
|
+
> Bloquear IPs internas
|
|
170
|
+
✅ Regla de header X- creada exitosamente:
|
|
171
|
+
ID: xheader_x_forwarded_for_1770792842636
|
|
172
|
+
Header: x-forwarded-for
|
|
173
|
+
Patrón: 192.168.
|
|
174
|
+
Acción: block
|
|
175
|
+
Razón: Bloquear IPs internas
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Ejemplo 2: Ver Estadísticas de Seguridad
|
|
179
|
+
```
|
|
180
|
+
> waf-security
|
|
181
|
+
=== Estadísticas de Seguridad del WAF ===
|
|
182
|
+
IPs bloqueadas temporalmente: 2
|
|
183
|
+
Intentos de ataque detectados: 5
|
|
184
|
+
Tipos de ataques detectados: 3
|
|
185
|
+
Registros de seguridad: 10
|
|
186
|
+
|
|
187
|
+
Accesos a rutas (Input/Output):
|
|
188
|
+
GET /: 8 accesos
|
|
189
|
+
POST /api/users: 3 accesos
|
|
190
|
+
GET /api/users: 4 accesos
|
|
191
|
+
|
|
192
|
+
Endpoints más accedidos:
|
|
193
|
+
GET /: 8 hits
|
|
194
|
+
GET /api/users: 4 hits
|
|
195
|
+
POST /api/users: 3 hits
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Ejemplo 3: Agregar IP a Lista Negra
|
|
199
|
+
```
|
|
200
|
+
> waf-blacklist
|
|
201
|
+
Introduce la IP a agregar a la lista negra (ej: 10.0.0.100):
|
|
202
|
+
> 10.0.0.100
|
|
203
|
+
IP 10.0.0.100 agregada a la lista negra.
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Consideraciones de Seguridad
|
|
207
|
+
|
|
208
|
+
- El servidor de administración solo escucha en localhost (127.0.0.1) por defecto
|
|
209
|
+
- Todas las operaciones de bloqueo son inmediatas y afectan al sistema en tiempo real
|
|
210
|
+
- Las reglas de seguridad se aplican antes de que la solicitud llegue a los controladores
|
|
211
|
+
- El sistema de persistencia permite mantener reglas entre reinicios del servidor
|
|
212
|
+
|
|
213
|
+
## Solución de Problemas
|
|
214
|
+
|
|
215
|
+
### Las estadísticas no se actualizan
|
|
216
|
+
- Verifica que el middleware de firewall esté activo en tu servidor
|
|
217
|
+
- Asegúrate de que las solicitudes estén pasando por el sistema de firewall
|
|
218
|
+
|
|
219
|
+
### Las reglas no se aplican
|
|
220
|
+
- Verifica que el firewall esté correctamente integrado en tu pipeline de middlewares
|
|
221
|
+
- Confirma que las reglas se hayan creado correctamente usando `waf-x-headers`
|
|
222
|
+
|
|
223
|
+
## Autor
|
|
224
|
+
|
|
225
|
+
Insitu Framework Team
|
|
226
|
+
|
|
227
|
+
## Versión
|
|
228
|
+
|
|
229
|
+
v1.0.0
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Cómo usar `addFilter` para `after_route_handler`
|
|
2
|
+
|
|
3
|
+
El hook `after_route_handler` está implementado como filtro y acción, lo que significa que puedes usar `addFilter` para modificar los objetos `req`, `res` o `matchedRoute` después de que se ejecuta el handler de la ruta.
|
|
4
|
+
|
|
5
|
+
## Ejemplo básico de uso:
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// Suponiendo que tienes acceso al objeto hooks del framework
|
|
9
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
10
|
+
// Puedes modificar req, res o matchedRoute aquí después de que se ejecutó el handler
|
|
11
|
+
// El objeto data contiene { req, res, matchedRoute }
|
|
12
|
+
|
|
13
|
+
// Por ejemplo, registrar información sobre la respuesta
|
|
14
|
+
console.log(`Handler completado para: ${req.method} ${req.url}`);
|
|
15
|
+
|
|
16
|
+
// O agregar encabezados personalizados después de la ejecución
|
|
17
|
+
if (!res.headersSent) {
|
|
18
|
+
res.setHeader('X-Response-Time', Date.now() - req.startTime);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Devolver el objeto modificado
|
|
22
|
+
return {
|
|
23
|
+
...data,
|
|
24
|
+
req: req,
|
|
25
|
+
res: res
|
|
26
|
+
};
|
|
27
|
+
}, 10, 3);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Ejemplo más complejo:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// Registro de métricas de rendimiento después de la ejecución del handler
|
|
34
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
35
|
+
// Calcular el tiempo de ejecución del handler
|
|
36
|
+
const executionTime = Date.now() - (req.handlerStartTime || Date.now());
|
|
37
|
+
|
|
38
|
+
// Registrar métricas
|
|
39
|
+
console.log(`Handler completado en ${executionTime}ms para: ${req.method} ${req.url}`);
|
|
40
|
+
|
|
41
|
+
// Agregar información de auditoría
|
|
42
|
+
req.responseAudit = {
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
executionTime: executionTime,
|
|
45
|
+
statusCode: res.statusCode || 200
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Devolver el objeto actualizado
|
|
49
|
+
return {
|
|
50
|
+
...data,
|
|
51
|
+
req: req
|
|
52
|
+
};
|
|
53
|
+
}, 10, 3);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Parámetros de `addFilter`:
|
|
57
|
+
|
|
58
|
+
- **Primer parámetro**: `'after_route_handler'` - El nombre del hook
|
|
59
|
+
- **Segundo parámetro**: La función callback que se ejecutará
|
|
60
|
+
- **Tercer parámetro**: `10` - La prioridad (números más bajos se ejecutan primero)
|
|
61
|
+
- **Cuarto parámetro**: `3` - Número de argumentos aceptados por el callback
|
|
62
|
+
- **Quinto parámetro** (opcional): Un identificador para el callback
|
|
63
|
+
|
|
64
|
+
## Estructura del callback:
|
|
65
|
+
|
|
66
|
+
El callback para `after_route_handler` recibe 4 parámetros:
|
|
67
|
+
1. `data` - El objeto que contiene `{ req, res, matchedRoute }`
|
|
68
|
+
2. `req` - El objeto de solicitud (ya modificado por el handler)
|
|
69
|
+
3. `res` - El objeto de respuesta (posiblemente ya enviado por el handler)
|
|
70
|
+
4. `matchedRoute` - Información sobre la ruta coincidente
|
|
71
|
+
|
|
72
|
+
El callback debe devolver el objeto modificado que será usado por el sistema.
|
|
73
|
+
|
|
74
|
+
## Ejemplo de uso en un módulo de auditoría:
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
// En algún módulo de tu aplicación
|
|
78
|
+
const afterRouteHandlerFilter = (data, req, res, matchedRoute) => {
|
|
79
|
+
// Registrar información de auditoría después de la ejecución del handler
|
|
80
|
+
const auditLog = {
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
method: req.method,
|
|
83
|
+
url: req.url,
|
|
84
|
+
userId: req.userId || 'anonymous',
|
|
85
|
+
statusCode: res.statusCode,
|
|
86
|
+
executionTime: Date.now() - (req.handlerStartTime || Date.now()),
|
|
87
|
+
route: matchedRoute.path
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Guardar registro de auditoría (podría ser en base de datos, archivo, etc.)
|
|
91
|
+
console.log('AUDIT:', JSON.stringify(auditLog));
|
|
92
|
+
|
|
93
|
+
// Agregar información de respuesta personalizada si es necesario
|
|
94
|
+
if (!res.headersSent && req.needsCustomResponse) {
|
|
95
|
+
res.setHeader('X-Audited', 'true');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
...data,
|
|
100
|
+
req: req
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// Registrar el filtro
|
|
105
|
+
hooks.addFilter('after_route_handler', afterRouteHandlerFilter, 10, 3, 'auditing-filter');
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Consideraciones importantes:
|
|
109
|
+
|
|
110
|
+
1. **Estado de la respuesta**: En el hook `after_route_handler`, la respuesta puede ya haber sido enviada al cliente (`res.headersSent` puede ser `true`), por lo que debes verificar este estado antes de intentar modificar encabezados o enviar contenido adicional.
|
|
111
|
+
|
|
112
|
+
2. **Tiempo de ejecución**: Este hook se ejecuta después del handler original, por lo que cualquier modificación a la respuesta debe tener en cuenta que el cuerpo de la respuesta ya puede haber sido enviado.
|
|
113
|
+
|
|
114
|
+
3. **Uso común**: Este hook es ideal para tareas de auditoría, métricas de rendimiento, registro de actividad y limpieza post-ejecución.
|
|
115
|
+
|
|
116
|
+
Esta implementación permite interceptar y modificar la solicitud y respuesta después de que se ejecuta el handler de la ruta, proporcionando una potente capacidad de procesamiento post-ejecución.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Cómo usar el hook `after_route_handler`
|
|
2
|
+
|
|
3
|
+
El hook `after_route_handler` se ejecuta justo después de que se ejecuta el handler de la ruta, y está disponible tanto como acción (`addAction`) como como filtro (`addFilter`).
|
|
4
|
+
|
|
5
|
+
## Ejemplo 1: Uso como acción para registrar actividad post-ejecución
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// Registrar cada vez que se completa la ejecución de un handler
|
|
9
|
+
hooks.addAction('after_route_handler', (req, res, matchedRoute) => {
|
|
10
|
+
const executionTime = Date.now() - req.startTime;
|
|
11
|
+
console.log(`Handler completado para: ${req.method} ${req.url} en ${executionTime}ms`);
|
|
12
|
+
console.log(`Código de estado: ${res.statusCode}`);
|
|
13
|
+
}, 10, 3);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Ejemplo 2: Uso como filtro para añadir headers después de la ejecución
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Añadir headers personalizados después de ejecutar el handler
|
|
20
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
21
|
+
// Calcular tiempo de ejecución
|
|
22
|
+
const executionTime = Date.now() - (req.startTime || Date.now());
|
|
23
|
+
|
|
24
|
+
// Añadir header de tiempo de ejecución si la respuesta no se ha enviado
|
|
25
|
+
if (!res.headersSent) {
|
|
26
|
+
res.setHeader('X-Response-Time', `${executionTime}ms`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Registrar métricas de rendimiento
|
|
30
|
+
console.log(`Ruta ${req.url} procesada en ${executionTime}ms`);
|
|
31
|
+
|
|
32
|
+
// Devolver el objeto modificado
|
|
33
|
+
return {
|
|
34
|
+
...data,
|
|
35
|
+
req: req
|
|
36
|
+
};
|
|
37
|
+
}, 10, 3);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Ejemplo 3: Uso como filtro para auditoría post-ejecución
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// Registrar información de auditoría después de la ejecución del handler
|
|
44
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
45
|
+
const auditLog = {
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
method: req.method,
|
|
48
|
+
url: req.url,
|
|
49
|
+
userId: req.userId || 'anonymous',
|
|
50
|
+
statusCode: res.statusCode,
|
|
51
|
+
executionTime: Date.now() - (req.handlerStartTime || Date.now()),
|
|
52
|
+
route: matchedRoute.path
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Guardar registro de auditoría
|
|
56
|
+
console.log('AUDIT:', JSON.stringify(auditLog));
|
|
57
|
+
|
|
58
|
+
return data;
|
|
59
|
+
}, 5, 3);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Ejemplo 4: Uso como filtro para limpieza de recursos
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
// Realizar tareas de limpieza después de la ejecución del handler
|
|
66
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
67
|
+
// Limpiar recursos temporales si es necesario
|
|
68
|
+
if (req.tempFiles) {
|
|
69
|
+
req.tempFiles.forEach(file => {
|
|
70
|
+
// Eliminar archivo temporal
|
|
71
|
+
fs.unlink(file.path, (err) => {
|
|
72
|
+
if (err) console.error('Error eliminando archivo temporal:', err);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Registrar fin de ejecución
|
|
78
|
+
console.log(`Finalizada ejecución para: ${req.method} ${req.url}`);
|
|
79
|
+
|
|
80
|
+
return data;
|
|
81
|
+
}, 15, 3);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Ejemplo 5: Uso combinado de acción y filtro
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
// Filtro para calcular métricas
|
|
88
|
+
hooks.addFilter('after_route_handler', (data, req, res, matchedRoute) => {
|
|
89
|
+
const responseTime = Date.now() - (req.startTime || Date.now());
|
|
90
|
+
|
|
91
|
+
// Añadir información de rendimiento al objeto de solicitud
|
|
92
|
+
req.performanceMetrics = {
|
|
93
|
+
responseTime: responseTime,
|
|
94
|
+
timestamp: new Date()
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
...data,
|
|
99
|
+
req: req
|
|
100
|
+
};
|
|
101
|
+
}, 5, 3);
|
|
102
|
+
|
|
103
|
+
// Acción para registrar evento
|
|
104
|
+
hooks.addAction('after_route_handler', (req, res, matchedRoute) => {
|
|
105
|
+
console.log(`[AFTER_ROUTE] Handler completado para ${req.method} ${req.url}`);
|
|
106
|
+
|
|
107
|
+
// Enviar métricas a un servicio de monitoreo
|
|
108
|
+
if (req.performanceMetrics) {
|
|
109
|
+
sendMetricsToMonitoringService(req.performanceMetrics);
|
|
110
|
+
}
|
|
111
|
+
}, 10, 3);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Parámetros importantes:
|
|
115
|
+
|
|
116
|
+
- El hook solo se ejecuta para solicitudes que **no sean** del tipo OPTIONS
|
|
117
|
+
- El filtro recibe `(data, req, res, matchedRoute)` y debe devolver el objeto `data` modificado
|
|
118
|
+
- La acción recibe `(req, res, matchedRoute)` y no necesita devolver nada
|
|
119
|
+
- El parámetro `acceptedArgs` define cuántos argumentos acepta tu callback (normalmente 3 para este hook)
|
|
120
|
+
- El parámetro `priority` define el orden de ejecución (valores más bajos se ejecutan primero)
|
|
121
|
+
|
|
122
|
+
## Consideraciones importantes:
|
|
123
|
+
|
|
124
|
+
1. **Estado de la respuesta**: En `after_route_handler`, la respuesta puede ya haber sido enviada al cliente (`res.headersSent` puede ser `true`), por lo que debes verificar este estado antes de intentar modificar encabezados o enviar contenido adicional.
|
|
125
|
+
|
|
126
|
+
2. **Tiempo de ejecución**: Este hook se ejecuta después del handler original, por lo que cualquier modificación a la respuesta debe tener en cuenta que el cuerpo de la respuesta ya puede haber sido enviado.
|
|
127
|
+
|
|
128
|
+
3. **Uso común**: Este hook es ideal para tareas de auditoría, métricas de rendimiento, registro de actividad post-ejecución y limpieza de recursos.
|
|
129
|
+
|
|
130
|
+
Este hook es especialmente útil para implementar lógica que debe ejecutarse después de cualquier handler de ruta, permitiendo registrar métricas, auditar la actividad o realizar tareas de limpieza.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Análisis Completo del Framework Insitu
|
|
2
|
+
|
|
3
|
+
## Descripción General
|
|
4
|
+
|
|
5
|
+
Insitu 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('insitu');
|
|
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 Insitu 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 Insitu 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 Insitu**: 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 Insitu
|
|
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 Insitu**: 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 Insitu
|
|
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 Insitu**: 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 Insitu 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.
|