jerkjs 2.0.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.
Files changed (177) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +171 -0
  3. package/doc/EXTENSION_MANUAL.md +958 -0
  4. package/doc/FIREWALL_MANUAL.md +419 -0
  5. package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
  6. package/doc/MANUAL_API_SDK.md +539 -0
  7. package/doc/MANUAL_MVC.md +397 -0
  8. package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
  9. package/doc/MIDDLEWARE_MANUAL.md +521 -0
  10. package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
  11. package/doc/frontend-and-sessions.md +356 -0
  12. package/examples/advanced/controllers/productController.js +64 -0
  13. package/examples/advanced/controllers/userController.js +85 -0
  14. package/examples/advanced/routes.json +51 -0
  15. package/examples/advanced_example.js +93 -0
  16. package/examples/basic/controllers/userController.js +85 -0
  17. package/examples/basic_example.js +72 -0
  18. package/examples/frontend/README.md +71 -0
  19. package/examples/frontend/app.js +71 -0
  20. package/examples/frontend/controllers/apiController.js +39 -0
  21. package/examples/frontend/controllers/authController.js +220 -0
  22. package/examples/frontend/controllers/formController.js +47 -0
  23. package/examples/frontend/controllers/messageController.js +96 -0
  24. package/examples/frontend/controllers/pageController.js +178 -0
  25. package/examples/frontend/controllers/staticController.js +167 -0
  26. package/examples/frontend/routes.json +90 -0
  27. package/examples/mvc_example/app.js +138 -0
  28. package/examples/mvc_example/views/home/index.html +26 -0
  29. package/examples/mvc_example/views/home/simple.html +3 -0
  30. package/examples/mvc_example/views/layout.html +23 -0
  31. package/examples/mvc_example/views/test.html +3 -0
  32. package/examples/mvc_example/views/user/invalid.html +6 -0
  33. package/examples/mvc_example/views/user/list.html +36 -0
  34. package/examples/mvc_example/views/user/notfound.html +6 -0
  35. package/examples/mvc_example/views/user/profile.html +11 -0
  36. package/examples/mvc_routes_example/app.js +34 -0
  37. package/examples/mvc_routes_example/controllers/mainController.js +27 -0
  38. package/examples/mvc_routes_example/controllers/productController.js +47 -0
  39. package/examples/mvc_routes_example/controllers/userController.js +76 -0
  40. package/examples/mvc_routes_example/routes.json +30 -0
  41. package/examples/mvc_routes_example/views/layout.html +31 -0
  42. package/examples/mvc_routes_example/views/main/index.html +11 -0
  43. package/examples/mvc_routes_example/views/product/catalog.html +24 -0
  44. package/examples/mvc_routes_example/views/user/invalid.html +6 -0
  45. package/examples/mvc_routes_example/views/user/list.html +40 -0
  46. package/examples/mvc_routes_example/views/user/notfound.html +6 -0
  47. package/examples/mvc_routes_example/views/user/profile.html +18 -0
  48. package/examples/public/README.md +92 -0
  49. package/examples/public/app.js +72 -0
  50. package/examples/public/controllers/healthController.js +20 -0
  51. package/examples/public/controllers/mainController.js +22 -0
  52. package/examples/public/controllers/userController.js +139 -0
  53. package/examples/public/routes.json +51 -0
  54. package/examples/v2/README.md +72 -0
  55. package/examples/v2/app.js +74 -0
  56. package/examples/v2/app_fixed.js +74 -0
  57. package/examples/v2/controllers/authController.js +64 -0
  58. package/examples/v2/controllers/mainController.js +24 -0
  59. package/examples/v2/controllers/protectedController.js +12 -0
  60. package/examples/v2/controllers/userController.js +16 -0
  61. package/examples/v2/package.json +27 -0
  62. package/examples/v2/routes.json +30 -0
  63. package/examples/v2/test_api.sh +47 -0
  64. package/examples/v2/tokens_example.sqlite +0 -0
  65. package/examples/v2.1_firewall_demo/README.md +113 -0
  66. package/examples/v2.1_firewall_demo/app.js +182 -0
  67. package/examples/v2.1_firewall_demo/package.json +27 -0
  68. package/examples/v2.1_hooks_demo/README.md +85 -0
  69. package/examples/v2.1_hooks_demo/app.js +101 -0
  70. package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
  71. package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
  72. package/examples/v2.1_hooks_demo/package.json +27 -0
  73. package/examples/v2.1_hooks_demo/routes.json +16 -0
  74. package/examples/v2.1_openapi_demo/README.md +82 -0
  75. package/examples/v2.1_openapi_demo/app.js +296 -0
  76. package/examples/v2.1_openapi_demo/package.json +26 -0
  77. package/examples/v2_cors/README.md +82 -0
  78. package/examples/v2_cors/app.js +108 -0
  79. package/examples/v2_cors/package.json +23 -0
  80. package/examples/v2_json_auth/README.md +83 -0
  81. package/examples/v2_json_auth/app.js +72 -0
  82. package/examples/v2_json_auth/controllers/authController.js +67 -0
  83. package/examples/v2_json_auth/controllers/mainController.js +16 -0
  84. package/examples/v2_json_auth/controllers/protectedController.js +12 -0
  85. package/examples/v2_json_auth/controllers/tokenController.js +28 -0
  86. package/examples/v2_json_auth/controllers/userController.js +15 -0
  87. package/examples/v2_json_auth/package.json +26 -0
  88. package/examples/v2_json_auth/routes.json +37 -0
  89. package/examples/v2_json_auth/tokens.json +20 -0
  90. package/examples/v2_mariadb_auth/README.md +94 -0
  91. package/examples/v2_mariadb_auth/app.js +81 -0
  92. package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
  93. package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
  94. package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
  95. package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
  96. package/examples/v2_mariadb_auth/package.json +27 -0
  97. package/examples/v2_mariadb_auth/routes.json +37 -0
  98. package/examples/v2_no_auth/README.md +75 -0
  99. package/examples/v2_no_auth/app.js +72 -0
  100. package/examples/v2_no_auth/controllers/healthController.js +14 -0
  101. package/examples/v2_no_auth/controllers/mainController.js +19 -0
  102. package/examples/v2_no_auth/controllers/productController.js +31 -0
  103. package/examples/v2_no_auth/controllers/publicController.js +16 -0
  104. package/examples/v2_no_auth/package.json +22 -0
  105. package/examples/v2_no_auth/routes.json +37 -0
  106. package/examples/v2_oauth/README.md +70 -0
  107. package/examples/v2_oauth/app.js +90 -0
  108. package/examples/v2_oauth/controllers/mainController.js +45 -0
  109. package/examples/v2_oauth/controllers/oauthController.js +247 -0
  110. package/examples/v2_oauth/controllers/protectedController.js +13 -0
  111. package/examples/v2_oauth/controllers/userController.js +17 -0
  112. package/examples/v2_oauth/package.json +26 -0
  113. package/examples/v2_oauth/routes.json +44 -0
  114. package/examples/v2_openapi/README.md +77 -0
  115. package/examples/v2_openapi/app.js +222 -0
  116. package/examples/v2_openapi/controllers/authController.js +52 -0
  117. package/examples/v2_openapi/controllers/mainController.js +26 -0
  118. package/examples/v2_openapi/controllers/productController.js +17 -0
  119. package/examples/v2_openapi/controllers/userController.js +27 -0
  120. package/examples/v2_openapi/package.json +26 -0
  121. package/examples/v2_openapi/routes.json +37 -0
  122. package/generate_token.js +10 -0
  123. package/index.js +85 -0
  124. package/jerk.jpg +0 -0
  125. package/lib/core/handler.js +86 -0
  126. package/lib/core/hooks.js +224 -0
  127. package/lib/core/router.js +204 -0
  128. package/lib/core/securityEnhancedServer.js +752 -0
  129. package/lib/core/server.js +369 -0
  130. package/lib/loader/controllerLoader.js +175 -0
  131. package/lib/loader/routeLoader.js +341 -0
  132. package/lib/middleware/auditLogger.js +208 -0
  133. package/lib/middleware/authenticator.js +565 -0
  134. package/lib/middleware/compressor.js +218 -0
  135. package/lib/middleware/cors.js +135 -0
  136. package/lib/middleware/firewall.js +443 -0
  137. package/lib/middleware/rateLimiter.js +210 -0
  138. package/lib/middleware/session.js +301 -0
  139. package/lib/middleware/validator.js +193 -0
  140. package/lib/mvc/controllerBase.js +207 -0
  141. package/lib/mvc/viewEngine.js +752 -0
  142. package/lib/utils/configParser.js +223 -0
  143. package/lib/utils/logger.js +145 -0
  144. package/lib/utils/mariadbTokenAdapter.js +226 -0
  145. package/lib/utils/openapiGenerator.js +140 -0
  146. package/lib/utils/sqliteTokenAdapter.js +224 -0
  147. package/lib/utils/tokenManager.js +254 -0
  148. package/package.json +47 -0
  149. package/v2examplle/v2_json_auth/README.md +83 -0
  150. package/v2examplle/v2_json_auth/app.js +72 -0
  151. package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
  152. package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
  153. package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
  154. package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
  155. package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
  156. package/v2examplle/v2_json_auth/package.json +26 -0
  157. package/v2examplle/v2_json_auth/routes.json +37 -0
  158. package/v2examplle/v2_json_auth/tokens.json +20 -0
  159. package/v2examplle/v2_mariadb_auth/README.md +94 -0
  160. package/v2examplle/v2_mariadb_auth/app.js +81 -0
  161. package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
  162. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
  163. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
  164. package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
  165. package/v2examplle/v2_mariadb_auth/package.json +27 -0
  166. package/v2examplle/v2_mariadb_auth/routes.json +37 -0
  167. package/v2examplle/v2_sqlite_auth/README.md +72 -0
  168. package/v2examplle/v2_sqlite_auth/app.js +74 -0
  169. package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
  170. package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
  171. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
  172. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
  173. package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
  174. package/v2examplle/v2_sqlite_auth/package.json +27 -0
  175. package/v2examplle/v2_sqlite_auth/routes.json +30 -0
  176. package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
  177. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -0,0 +1,419 @@
1
+ # Manual de Uso del Módulo de Firewall
2
+
3
+ Visita nuestra página web: https://jerk.page.gd/
4
+ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/jerk/
5
+
6
+ ## Índice
7
+ 1. [Introducción](#introducción)
8
+ 2. [Instalación y Configuración](#instalación-y-configuración)
9
+ 3. [Uso Básico](#uso-básico)
10
+ 4. [Configuración Avanzada](#configuración-avanzada)
11
+ 5. [Extensión del Firewall](#extensión-del-firewall)
12
+ 6. [Eventos y Hooks](#eventos-y-hooks)
13
+ 7. [Gestión de Listas](#gestión-de-listas)
14
+ 8. [Ejemplos Prácticos](#ejemplos-prácticos)
15
+
16
+ ## Introducción
17
+
18
+ El módulo de Firewall es una funcionalidad de seguridad integrada en el framework API SDK JS que proporciona una capa de protección contra patrones de ataque comunes como SQL Injection, Cross-Site Scripting (XSS), Path Traversal, y otros vectores de ataque. El firewall incluye detección automática de amenazas, bloqueo de IPs, listas blancas/negras y un sistema de reglas personalizables.
19
+
20
+ ## Instalación y Configuración
21
+
22
+ El módulo de firewall está integrado en el framework y se puede importar directamente:
23
+
24
+ ```javascript
25
+ const { APIServer, Firewall, Logger } = require('jerk');
26
+ ```
27
+
28
+ ## Uso Básico
29
+
30
+ ### 1. Crear una instancia del firewall
31
+
32
+ ```javascript
33
+ const firewall = new Firewall({
34
+ maxAttempts: 5, // Número máximo de intentos fallidos antes de bloquear
35
+ blockDuration: 900000, // Duración del bloqueo en ms (15 minutos)
36
+ whitelist: ['127.0.0.1'], // IPs que no deben ser bloqueadas
37
+ blacklist: [], // IPs que siempre deben ser bloqueadas
38
+ rules: [], // Reglas personalizadas de firewall
39
+ logger: new Logger() // Instancia de logger para eventos
40
+ });
41
+ ```
42
+
43
+ ### 2. Aplicar el middleware de firewall al servidor
44
+
45
+ ```javascript
46
+ const server = new APIServer({ port: 3000 });
47
+
48
+ // Aplicar el middleware de firewall antes de iniciar el servidor
49
+ server.use(firewall.middleware());
50
+
51
+ server.start();
52
+ ```
53
+
54
+ ### 3. El firewall automáticamente:
55
+
56
+ - Detecta patrones de ataque en las solicitudes
57
+ - Bloquea IPs que superan el límite de intentos fallidos
58
+ - Aplica reglas personalizadas
59
+ - Verifica listas blancas y negras
60
+ - Emite eventos a través del sistema de hooks
61
+
62
+ ## Configuración Avanzada
63
+
64
+ ### Parámetros de Configuración
65
+
66
+ - `maxAttempts`: Número máximo de intentos fallidos antes de bloquear una IP (por defecto: 5)
67
+ - `blockDuration`: Duración del bloqueo en milisegundos (por defecto: 900000 = 15 minutos)
68
+ - `whitelist`: Array de IPs que nunca serán bloqueadas
69
+ - `blacklist`: Array de IPs que siempre serán bloqueadas
70
+ - `rules`: Array de reglas personalizadas de firewall
71
+ - `logger`: Instancia de logger para eventos de seguridad
72
+
73
+ ### Reglas Personalizadas
74
+
75
+ Puedes definir reglas personalizadas para detectar patrones específicos:
76
+
77
+ ```javascript
78
+ const customRules = [
79
+ {
80
+ name: 'large_payload',
81
+ condition: (req) => {
82
+ // Bloquear solicitudes con cuerpo muy grande
83
+ const contentLength = req.headers['content-length'];
84
+ return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
85
+ },
86
+ action: 'block', // 'block' o 'monitor'
87
+ reason: 'Solicitud con payload excesivamente grande'
88
+ },
89
+ {
90
+ name: 'suspicious_user_agent',
91
+ condition: (req) => {
92
+ const userAgent = req.headers['user-agent'] || '';
93
+ // Detectar user agents sospechosos
94
+ const suspiciousAgents = [
95
+ /sqlmap/i,
96
+ /nikto/i,
97
+ /nessus/i,
98
+ /nmap/i,
99
+ /dirbuster/i
100
+ ];
101
+ return suspiciousAgents.some(agent => agent.test(userAgent));
102
+ },
103
+ action: 'block',
104
+ reason: 'User agent sospechoso detectado'
105
+ }
106
+ ];
107
+
108
+ const firewall = new Firewall({
109
+ rules: customRules,
110
+ // ... otras opciones
111
+ });
112
+ ```
113
+
114
+ ## Extensión del Firewall
115
+
116
+ El módulo de firewall es altamente extensible gracias al sistema de hooks integrado. Existen varias formas de extender su funcionalidad:
117
+
118
+ ### 1. Añadiendo Reglas Personalizadas en Tiempo de Ejecución
119
+
120
+ ```javascript
121
+ // Añadir una regla después de crear la instancia
122
+ firewall.addRule(
123
+ 'custom_attack_pattern',
124
+ (req, clientIP) => {
125
+ // Tu lógica de detección aquí
126
+ return req.url.includes('malicious-pattern');
127
+ },
128
+ 'block',
129
+ 'Patrón de ataque personalizado detectado'
130
+ );
131
+ ```
132
+
133
+ ### 2. Utilizando el Sistema de Hooks
134
+
135
+ El firewall emite varios eventos que puedes interceptar para extender su comportamiento:
136
+
137
+ ```javascript
138
+ const { HookSystem } = require('jerk');
139
+ const hooks = new HookSystem();
140
+
141
+ // Hook cuando se recibe una solicitud
142
+ hooks.addAction('firewall_request_received', (req, res) => {
143
+ console.log(`Solicitud recibida: ${req.method} ${req.url}`);
144
+ });
145
+
146
+ // Hook cuando se activa una regla
147
+ hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
148
+ console.log(`Regla activada: ${rule.name} para IP: ${clientIP}`);
149
+ });
150
+
151
+ // Hook cuando una IP es bloqueada
152
+ hooks.addAction('firewall_ip_blocked', (ip, reason, req, res) => {
153
+ console.log(`IP bloqueada: ${ip} - Razón: ${reason}`);
154
+ });
155
+
156
+ // Hook cuando una solicitud es bloqueada
157
+ hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
158
+ console.log(`Solicitud bloqueada por regla: ${rule.name} para IP: ${clientIP}`);
159
+ });
160
+
161
+ // Hook cuando una solicitud es monitoreada
162
+ hooks.addAction('firewall_request_monitored', (rule, clientIP, req) => {
163
+ console.log(`Solicitud monitoreada: ${rule.name} para IP: ${clientIP}`);
164
+ });
165
+
166
+ // Hook cuando una solicitud es permitida
167
+ hooks.addAction('firewall_request_allowed', (req, res) => {
168
+ console.log(`Solicitud permitida: ${req.method} ${req.url}`);
169
+ });
170
+
171
+ // Hook cuando se actualiza la whitelist
172
+ hooks.addAction('firewall_whitelist_updated', (ip, action, whitelist) => {
173
+ console.log(`Whitelist actualizada: IP ${ip} ${action}, total: ${whitelist.length}`);
174
+ });
175
+
176
+ // Hook cuando se actualiza la blacklist
177
+ hooks.addAction('firewall_blacklist_updated', (ip, action, blacklist) => {
178
+ console.log(`Blacklist actualizada: IP ${ip} ${action}, total: ${blacklist.length}`);
179
+ });
180
+ ```
181
+
182
+ ### 3. Extensión mediante Filtros
183
+
184
+ También puedes usar filtros para modificar el comportamiento del firewall:
185
+
186
+ ```javascript
187
+ // Filtrar la decisión de bloqueo
188
+ hooks.addFilter('modify_firewall_decision', (shouldBlock, req, res) => {
189
+ // Lógica personalizada para decidir si se debe bloquear
190
+ if (someCondition(req)) {
191
+ return false; // No bloquear
192
+ }
193
+ return shouldBlock; // Mantener decisión original
194
+ });
195
+ ```
196
+
197
+ ### 4. Herencia y Personalización
198
+
199
+ Puedes extender la clase Firewall para añadir funcionalidades personalizadas:
200
+
201
+ ```javascript
202
+ const { Firewall } = require('jerk');
203
+
204
+ class CustomFirewall extends Firewall {
205
+ constructor(options = {}) {
206
+ super(options);
207
+ this.customDetectionMethods = [];
208
+ }
209
+
210
+ // Añadir método de detección personalizado
211
+ addCustomDetection(method) {
212
+ this.customDetectionMethods.push(method);
213
+ }
214
+
215
+ // Sobreescribir el método de verificación de reglas
216
+ checkRules(req) {
217
+ // Primero ejecutar la lógica original
218
+ const originalResult = super.checkRules(req);
219
+ if (originalResult) {
220
+ return originalResult;
221
+ }
222
+
223
+ // Luego verificar métodos de detección personalizados
224
+ for (const method of this.customDetectionMethods) {
225
+ const result = method(req, this.getClientIP(req));
226
+ if (result) {
227
+ return result;
228
+ }
229
+ }
230
+
231
+ return null;
232
+ }
233
+ }
234
+
235
+ // Uso del firewall personalizado
236
+ const customFirewall = new CustomFirewall({
237
+ // opciones normales
238
+ });
239
+
240
+ customFirewall.addCustomDetection((req, clientIP) => {
241
+ // Tu lógica personalizada de detección
242
+ if (req.headers['x-custom-header'] === 'suspicious-value') {
243
+ return {
244
+ matched: true,
245
+ rule: 'custom_header_check',
246
+ action: 'block',
247
+ reason: 'Cabecera personalizada sospechosa detectada'
248
+ };
249
+ }
250
+ return null;
251
+ });
252
+ ```
253
+
254
+ ## Eventos y Hooks
255
+
256
+ El firewall emite los siguientes eventos:
257
+
258
+ - `firewall_request_received`: Cuando se recibe una solicitud
259
+ - `firewall_ip_blocked`: Cuando una IP es bloqueada
260
+ - `firewall_rule_triggered`: Cuando se activa una regla de firewall
261
+ - `firewall_request_blocked`: Cuando una solicitud es bloqueada
262
+ - `firewall_request_monitored`: Cuando una solicitud es monitoreada
263
+ - `firewall_request_allowed`: Cuando una solicitud es permitida
264
+ - `firewall_whitelist_updated`: Cuando se actualiza la whitelist
265
+ - `firewall_blacklist_updated`: Cuando se actualiza la blacklist
266
+
267
+ ## Gestión de Listas
268
+
269
+ ### Listas Blancas (Whitelist)
270
+
271
+ ```javascript
272
+ // Añadir IP a la whitelist
273
+ firewall.addToWhitelist('192.168.1.100');
274
+
275
+ // Remover IP de la whitelist
276
+ firewall.removeFromWhitelist('192.168.1.100');
277
+ ```
278
+
279
+ ### Listas Negras (Blacklist)
280
+
281
+ ```javascript
282
+ // Añadir IP a la blacklist
283
+ firewall.addToBlacklist('10.0.0.50', 'IP maliciosa detectada');
284
+
285
+ // Remover IP de la blacklist
286
+ firewall.removeFromBlacklist('10.0.0.50');
287
+ ```
288
+
289
+ ### Obtener Estado del Firewall
290
+
291
+ ```javascript
292
+ const status = firewall.getStatus();
293
+ console.log(status);
294
+ /*
295
+ {
296
+ blockedIPs: [...],
297
+ whitelist: [...],
298
+ blacklist: [...],
299
+ totalBlocked: 0,
300
+ rules: [...]
301
+ }
302
+ */
303
+ ```
304
+
305
+ ## Ejemplos Prácticos
306
+
307
+ ### Ejemplo Completo de API con Firewall
308
+
309
+ ```javascript
310
+ const { APIServer, Firewall, Logger, HookSystem } = require('jerk');
311
+
312
+ async function startSecureAPI() {
313
+ // Crear servidor
314
+ const server = new APIServer({
315
+ port: 3000,
316
+ host: 'localhost'
317
+ });
318
+
319
+ // Crear logger
320
+ const logger = new Logger({ level: 'info' });
321
+
322
+ // Crear firewall con configuración personalizada
323
+ const firewall = new Firewall({
324
+ maxAttempts: 3,
325
+ blockDuration: 300000, // 5 minutos
326
+ whitelist: ['127.0.0.1', '::1'],
327
+ blacklist: [],
328
+ rules: [
329
+ {
330
+ name: 'large_payload',
331
+ condition: (req) => {
332
+ const contentLength = req.headers['content-length'];
333
+ return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
334
+ },
335
+ action: 'block',
336
+ reason: 'Payload excesivamente grande'
337
+ }
338
+ ],
339
+ logger
340
+ });
341
+
342
+ // Configurar hooks
343
+ const hooks = new HookSystem();
344
+
345
+ hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
346
+ logger.warn(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
347
+ // Aquí puedes añadir lógica adicional, como alertas o notificaciones
348
+ });
349
+
350
+ // Aplicar middleware de firewall
351
+ server.use(firewall.middleware());
352
+
353
+ // Añadir rutas
354
+ server.addRoute('GET', '/', (req, res) => {
355
+ res.writeHead(200, { 'Content-Type': 'application/json' });
356
+ res.end(JSON.stringify({
357
+ message: 'API segura con firewall activado',
358
+ firewallStatus: firewall.getStatus()
359
+ }));
360
+ });
361
+
362
+ // Iniciar servidor
363
+ server.start();
364
+ }
365
+
366
+ startSecureAPI();
367
+ ```
368
+
369
+ ### Ejemplo de Extensión con Hooks
370
+
371
+ ```javascript
372
+ const { APIServer, Firewall, Logger, HookSystem } = require('jerk');
373
+
374
+ // Crear sistema de hooks
375
+ const hooks = new HookSystem();
376
+
377
+ // Crear firewall
378
+ const firewall = new Firewall({
379
+ logger: new Logger()
380
+ });
381
+
382
+ // Extender funcionalidad con hooks
383
+ hooks.addAction('firewall_request_blocked', async (rule, clientIP, req, res) => {
384
+ // Registrar intento de ataque en una base de datos
385
+ await logSecurityIncident({
386
+ ip: clientIP,
387
+ rule: rule.name,
388
+ url: req.url,
389
+ userAgent: req.headers['user-agent'],
390
+ timestamp: new Date()
391
+ });
392
+
393
+ // Enviar alerta si es necesario
394
+ if (rule.name === 'sql_injection') {
395
+ await sendAlertEmail('Ataque de SQL Injection detectado', clientIP);
396
+ }
397
+ });
398
+
399
+ hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
400
+ // Incrementar contador de amenazas para esta IP
401
+ incrementThreatScore(clientIP);
402
+ });
403
+
404
+ // Aplicar firewall al servidor
405
+ const server = new APIServer({ port: 3000 });
406
+ server.use(firewall.middleware());
407
+ ```
408
+
409
+ ## Consideraciones de Seguridad
410
+
411
+ - Asegúrate de mantener actualizada la lista de IPs en la whitelist con direcciones confiables
412
+ - Monitorea regularmente las IPs bloqueadas para identificar falsos positivos
413
+ - Personaliza las reglas según las necesidades específicas de tu aplicación
414
+ - Utiliza los hooks para integrar con sistemas de alerta y monitoreo externos
415
+ - Considera implementar un sistema de "fail2ban" personalizado para bloqueos temporales automáticos
416
+
417
+ ## Conclusión
418
+
419
+ El módulo de firewall proporciona una capa robusta de seguridad para tus APIs, con capacidad de extensión a través del sistema de hooks y reglas personalizadas. Su integración directa en el framework permite una implementación sencilla pero poderosa para proteger tus servicios web de amenazas comunes.