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.
- package/LICENSE +200 -0
- package/README.md +171 -0
- package/doc/EXTENSION_MANUAL.md +958 -0
- package/doc/FIREWALL_MANUAL.md +419 -0
- package/doc/HOOKS_REFERENCE_IMPROVED.md +599 -0
- package/doc/MANUAL_API_SDK.md +539 -0
- package/doc/MANUAL_MVC.md +397 -0
- package/doc/MARIADB_TOKENS_IMPLEMENTATION.md +113 -0
- package/doc/MIDDLEWARE_MANUAL.md +521 -0
- package/doc/OAUTH2_GOOGLE_MANUAL.md +408 -0
- package/doc/frontend-and-sessions.md +356 -0
- package/examples/advanced/controllers/productController.js +64 -0
- package/examples/advanced/controllers/userController.js +85 -0
- package/examples/advanced/routes.json +51 -0
- package/examples/advanced_example.js +93 -0
- package/examples/basic/controllers/userController.js +85 -0
- package/examples/basic_example.js +72 -0
- package/examples/frontend/README.md +71 -0
- package/examples/frontend/app.js +71 -0
- package/examples/frontend/controllers/apiController.js +39 -0
- package/examples/frontend/controllers/authController.js +220 -0
- package/examples/frontend/controllers/formController.js +47 -0
- package/examples/frontend/controllers/messageController.js +96 -0
- package/examples/frontend/controllers/pageController.js +178 -0
- package/examples/frontend/controllers/staticController.js +167 -0
- package/examples/frontend/routes.json +90 -0
- package/examples/mvc_example/app.js +138 -0
- package/examples/mvc_example/views/home/index.html +26 -0
- package/examples/mvc_example/views/home/simple.html +3 -0
- package/examples/mvc_example/views/layout.html +23 -0
- package/examples/mvc_example/views/test.html +3 -0
- package/examples/mvc_example/views/user/invalid.html +6 -0
- package/examples/mvc_example/views/user/list.html +36 -0
- package/examples/mvc_example/views/user/notfound.html +6 -0
- package/examples/mvc_example/views/user/profile.html +11 -0
- package/examples/mvc_routes_example/app.js +34 -0
- package/examples/mvc_routes_example/controllers/mainController.js +27 -0
- package/examples/mvc_routes_example/controllers/productController.js +47 -0
- package/examples/mvc_routes_example/controllers/userController.js +76 -0
- package/examples/mvc_routes_example/routes.json +30 -0
- package/examples/mvc_routes_example/views/layout.html +31 -0
- package/examples/mvc_routes_example/views/main/index.html +11 -0
- package/examples/mvc_routes_example/views/product/catalog.html +24 -0
- package/examples/mvc_routes_example/views/user/invalid.html +6 -0
- package/examples/mvc_routes_example/views/user/list.html +40 -0
- package/examples/mvc_routes_example/views/user/notfound.html +6 -0
- package/examples/mvc_routes_example/views/user/profile.html +18 -0
- package/examples/public/README.md +92 -0
- package/examples/public/app.js +72 -0
- package/examples/public/controllers/healthController.js +20 -0
- package/examples/public/controllers/mainController.js +22 -0
- package/examples/public/controllers/userController.js +139 -0
- package/examples/public/routes.json +51 -0
- package/examples/v2/README.md +72 -0
- package/examples/v2/app.js +74 -0
- package/examples/v2/app_fixed.js +74 -0
- package/examples/v2/controllers/authController.js +64 -0
- package/examples/v2/controllers/mainController.js +24 -0
- package/examples/v2/controllers/protectedController.js +12 -0
- package/examples/v2/controllers/userController.js +16 -0
- package/examples/v2/package.json +27 -0
- package/examples/v2/routes.json +30 -0
- package/examples/v2/test_api.sh +47 -0
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +113 -0
- package/examples/v2.1_firewall_demo/app.js +182 -0
- package/examples/v2.1_firewall_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/README.md +85 -0
- package/examples/v2.1_hooks_demo/app.js +101 -0
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +29 -0
- package/examples/v2.1_hooks_demo/controllers/mainController.js +18 -0
- package/examples/v2.1_hooks_demo/package.json +27 -0
- package/examples/v2.1_hooks_demo/routes.json +16 -0
- package/examples/v2.1_openapi_demo/README.md +82 -0
- package/examples/v2.1_openapi_demo/app.js +296 -0
- package/examples/v2.1_openapi_demo/package.json +26 -0
- package/examples/v2_cors/README.md +82 -0
- package/examples/v2_cors/app.js +108 -0
- package/examples/v2_cors/package.json +23 -0
- package/examples/v2_json_auth/README.md +83 -0
- package/examples/v2_json_auth/app.js +72 -0
- package/examples/v2_json_auth/controllers/authController.js +67 -0
- package/examples/v2_json_auth/controllers/mainController.js +16 -0
- package/examples/v2_json_auth/controllers/protectedController.js +12 -0
- package/examples/v2_json_auth/controllers/tokenController.js +28 -0
- package/examples/v2_json_auth/controllers/userController.js +15 -0
- package/examples/v2_json_auth/package.json +26 -0
- package/examples/v2_json_auth/routes.json +37 -0
- package/examples/v2_json_auth/tokens.json +20 -0
- package/examples/v2_mariadb_auth/README.md +94 -0
- package/examples/v2_mariadb_auth/app.js +81 -0
- package/examples/v2_mariadb_auth/controllers/authController.js +95 -0
- package/examples/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/examples/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/examples/v2_mariadb_auth/controllers/userController.js +17 -0
- package/examples/v2_mariadb_auth/package.json +27 -0
- package/examples/v2_mariadb_auth/routes.json +37 -0
- package/examples/v2_no_auth/README.md +75 -0
- package/examples/v2_no_auth/app.js +72 -0
- package/examples/v2_no_auth/controllers/healthController.js +14 -0
- package/examples/v2_no_auth/controllers/mainController.js +19 -0
- package/examples/v2_no_auth/controllers/productController.js +31 -0
- package/examples/v2_no_auth/controllers/publicController.js +16 -0
- package/examples/v2_no_auth/package.json +22 -0
- package/examples/v2_no_auth/routes.json +37 -0
- package/examples/v2_oauth/README.md +70 -0
- package/examples/v2_oauth/app.js +90 -0
- package/examples/v2_oauth/controllers/mainController.js +45 -0
- package/examples/v2_oauth/controllers/oauthController.js +247 -0
- package/examples/v2_oauth/controllers/protectedController.js +13 -0
- package/examples/v2_oauth/controllers/userController.js +17 -0
- package/examples/v2_oauth/package.json +26 -0
- package/examples/v2_oauth/routes.json +44 -0
- package/examples/v2_openapi/README.md +77 -0
- package/examples/v2_openapi/app.js +222 -0
- package/examples/v2_openapi/controllers/authController.js +52 -0
- package/examples/v2_openapi/controllers/mainController.js +26 -0
- package/examples/v2_openapi/controllers/productController.js +17 -0
- package/examples/v2_openapi/controllers/userController.js +27 -0
- package/examples/v2_openapi/package.json +26 -0
- package/examples/v2_openapi/routes.json +37 -0
- package/generate_token.js +10 -0
- package/index.js +85 -0
- package/jerk.jpg +0 -0
- package/lib/core/handler.js +86 -0
- package/lib/core/hooks.js +224 -0
- package/lib/core/router.js +204 -0
- package/lib/core/securityEnhancedServer.js +752 -0
- package/lib/core/server.js +369 -0
- package/lib/loader/controllerLoader.js +175 -0
- package/lib/loader/routeLoader.js +341 -0
- package/lib/middleware/auditLogger.js +208 -0
- package/lib/middleware/authenticator.js +565 -0
- package/lib/middleware/compressor.js +218 -0
- package/lib/middleware/cors.js +135 -0
- package/lib/middleware/firewall.js +443 -0
- package/lib/middleware/rateLimiter.js +210 -0
- package/lib/middleware/session.js +301 -0
- package/lib/middleware/validator.js +193 -0
- package/lib/mvc/controllerBase.js +207 -0
- package/lib/mvc/viewEngine.js +752 -0
- package/lib/utils/configParser.js +223 -0
- package/lib/utils/logger.js +145 -0
- package/lib/utils/mariadbTokenAdapter.js +226 -0
- package/lib/utils/openapiGenerator.js +140 -0
- package/lib/utils/sqliteTokenAdapter.js +224 -0
- package/lib/utils/tokenManager.js +254 -0
- package/package.json +47 -0
- package/v2examplle/v2_json_auth/README.md +83 -0
- package/v2examplle/v2_json_auth/app.js +72 -0
- package/v2examplle/v2_json_auth/controllers/authController.js +67 -0
- package/v2examplle/v2_json_auth/controllers/mainController.js +16 -0
- package/v2examplle/v2_json_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_json_auth/controllers/tokenController.js +28 -0
- package/v2examplle/v2_json_auth/controllers/userController.js +15 -0
- package/v2examplle/v2_json_auth/package.json +26 -0
- package/v2examplle/v2_json_auth/routes.json +37 -0
- package/v2examplle/v2_json_auth/tokens.json +20 -0
- package/v2examplle/v2_mariadb_auth/README.md +94 -0
- package/v2examplle/v2_mariadb_auth/app.js +81 -0
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +95 -0
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +31 -0
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +17 -0
- package/v2examplle/v2_mariadb_auth/package.json +27 -0
- package/v2examplle/v2_mariadb_auth/routes.json +37 -0
- package/v2examplle/v2_sqlite_auth/README.md +72 -0
- package/v2examplle/v2_sqlite_auth/app.js +74 -0
- package/v2examplle/v2_sqlite_auth/app_fixed.js +74 -0
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +64 -0
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +24 -0
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +12 -0
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +16 -0
- package/v2examplle/v2_sqlite_auth/package.json +27 -0
- package/v2examplle/v2_sqlite_auth/routes.json +30 -0
- package/v2examplle/v2_sqlite_auth/test_api.sh +47 -0
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Ejemplo de API con Funcionalidades de Firewall Avanzado (v2.1.0)
|
|
2
|
+
|
|
3
|
+
Este ejemplo demuestra las funcionalidades de firewall avanzado implementadas en la versión 2.1.0 del Framework API SDK, incluyendo el sistema de hooks para eventos de seguridad.
|
|
4
|
+
|
|
5
|
+
## Características del Firewall
|
|
6
|
+
|
|
7
|
+
- **Detección de Patrones de Ataque**: Identificación de SQL Injection, XSS, Path Traversal
|
|
8
|
+
- **Bloqueo de IPs**: Sistema de bloqueo tras múltiples intentos fallidos
|
|
9
|
+
- **Listas Blancas y Negras**: IPs permitidas o prohibidas permanentemente
|
|
10
|
+
- **Reglas Personalizadas**: Posibilidad de definir reglas personalizadas de firewall
|
|
11
|
+
- **Sistema de Hooks**: Integración con el sistema de hooks para eventos de seguridad
|
|
12
|
+
- **Monitoreo de Solicitudes Sospechosas**: Registro y seguimiento de actividades sospechosas
|
|
13
|
+
|
|
14
|
+
## Configuración
|
|
15
|
+
|
|
16
|
+
No se requieren dependencias adicionales más allá del Framework API SDK.
|
|
17
|
+
|
|
18
|
+
## Uso
|
|
19
|
+
|
|
20
|
+
1. Inicia el servidor:
|
|
21
|
+
```bash
|
|
22
|
+
node app.js
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. El servidor escuchará en `http://localhost:8097`
|
|
26
|
+
|
|
27
|
+
## Endpoints de Prueba
|
|
28
|
+
|
|
29
|
+
- `GET /` - Página de inicio con información del firewall
|
|
30
|
+
- `GET /test-attacks` - Prueba de detección de ataques
|
|
31
|
+
- `GET /test-sql-injection` - Prueba de detección de SQL injection (será bloqueada)
|
|
32
|
+
- `GET /test-xss` - Prueba de detección de XSS (será bloqueada)
|
|
33
|
+
- `GET /test-path-traversal` - Prueba de detección de path traversal (será bloqueada)
|
|
34
|
+
- `GET /firewall-status` - Estado actual del firewall
|
|
35
|
+
|
|
36
|
+
## Pruebas de Seguridad
|
|
37
|
+
|
|
38
|
+
### Prueba de SQL Injection
|
|
39
|
+
```bash
|
|
40
|
+
curl -X GET "http://localhost:8097/test-sql-injection?id=1'%20OR%20'1'='1"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Prueba de XSS
|
|
44
|
+
```bash
|
|
45
|
+
curl -X GET "http://localhost:8097/test-xss?input=<script>alert('xss')</script>"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Prueba de Path Traversal
|
|
49
|
+
```bash
|
|
50
|
+
curl -X GET "http://localhost:8097/test-path-traversal?file=../../../etc/passwd"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Prueba de User Agent Sospechoso
|
|
54
|
+
```bash
|
|
55
|
+
curl -X GET http://localhost:8097/test-attacks -H "User-Agent: sqlmap/1.0"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Sistema de Hooks de Seguridad
|
|
59
|
+
|
|
60
|
+
El ejemplo demuestra cómo usar el sistema de hooks para eventos de seguridad:
|
|
61
|
+
|
|
62
|
+
- `firewall_rule_triggered` - Se dispara cuando se activa una regla de firewall
|
|
63
|
+
- `firewall_ip_blocked` - Se dispara cuando se bloquea una IP
|
|
64
|
+
- `firewall_security_event` - Se dispara para eventos generales de seguridad
|
|
65
|
+
|
|
66
|
+
## Configuración del Firewall
|
|
67
|
+
|
|
68
|
+
El firewall se puede configurar con las siguientes opciones:
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
const firewall = new Firewall({
|
|
72
|
+
maxAttempts: 5, // Número máximo de intentos antes de bloquear
|
|
73
|
+
blockDuration: 900000, // Duración del bloqueo en ms (15 minutos)
|
|
74
|
+
whitelist: ['127.0.0.1'], // IPs que no deben ser bloqueadas
|
|
75
|
+
blacklist: [], // IPs que siempre deben ser bloqueadas
|
|
76
|
+
rules: [ // Reglas personalizadas de firewall
|
|
77
|
+
{
|
|
78
|
+
name: 'large_payload',
|
|
79
|
+
condition: (req) => {
|
|
80
|
+
// Condición para activar la regla
|
|
81
|
+
},
|
|
82
|
+
action: 'block', // 'block' o 'monitor'
|
|
83
|
+
reason: 'Motivo del bloqueo'
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
logger: logger // Instancia de logger para eventos
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Estructura del proyecto
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
examples/v2.1_firewall_demo/
|
|
94
|
+
├── app.js # Punto de entrada de la aplicación con firewall
|
|
95
|
+
├── controllers/ # Controladores de las rutas
|
|
96
|
+
│ └── (controladores según sea necesario)
|
|
97
|
+
└── README.md
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Reglas de Firewall Integradas
|
|
101
|
+
|
|
102
|
+
1. **SQL Injection Detection**: Detecta patrones comunes de inyección SQL
|
|
103
|
+
2. **XSS Detection**: Detecta patrones comunes de Cross-Site Scripting
|
|
104
|
+
3. **Path Traversal**: Detecta intentos de navegación fuera del directorio permitido
|
|
105
|
+
4. **Large Payload**: Bloquea solicitudes con cuerpos excesivamente grandes
|
|
106
|
+
5. **Suspicious User Agents**: Detecta user agents asociados con herramientas de ataque
|
|
107
|
+
|
|
108
|
+
## Seguridad
|
|
109
|
+
|
|
110
|
+
- El firewall bloquea automáticamente solicitudes que contienen patrones de ataque conocidos
|
|
111
|
+
- Las IPs que generan múltiples violaciones son bloqueadas temporalmente
|
|
112
|
+
- Las reglas personalizadas permiten una protección adaptada a necesidades específicas
|
|
113
|
+
- El sistema de hooks permite una respuesta personalizada a eventos de seguridad
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejemplo de API con funcionalidades de firewall avanzado (v2.1.0)
|
|
3
|
+
* Demostrando el uso del sistema de firewall con el sistema de hooks
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
APIServer,
|
|
8
|
+
Authenticator,
|
|
9
|
+
RateLimiter,
|
|
10
|
+
Logger,
|
|
11
|
+
HookSystem,
|
|
12
|
+
Firewall
|
|
13
|
+
} = require('../../index.js');
|
|
14
|
+
|
|
15
|
+
async function startServer() {
|
|
16
|
+
// Crear instancia del servidor
|
|
17
|
+
const server = new APIServer({
|
|
18
|
+
port: 8097,
|
|
19
|
+
host: 'localhost'
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Crear instancia del logger
|
|
23
|
+
const logger = new Logger({ level: 'info' });
|
|
24
|
+
|
|
25
|
+
// Crear instancia del sistema de hooks
|
|
26
|
+
const hooks = new HookSystem();
|
|
27
|
+
|
|
28
|
+
// Crear instancia del firewall
|
|
29
|
+
const firewall = new Firewall({
|
|
30
|
+
maxAttempts: 3,
|
|
31
|
+
blockDuration: 300000, // 5 minutos para pruebas
|
|
32
|
+
whitelist: ['127.0.0.1', '::1'], // IPs locales
|
|
33
|
+
blacklist: [], // Ninguna IP bloqueada por defecto
|
|
34
|
+
rules: [
|
|
35
|
+
{
|
|
36
|
+
name: 'large_payload',
|
|
37
|
+
condition: (req) => {
|
|
38
|
+
// Bloquear solicitudes con cuerpo muy grande
|
|
39
|
+
const contentLength = req.headers['content-length'];
|
|
40
|
+
return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
|
|
41
|
+
},
|
|
42
|
+
action: 'block',
|
|
43
|
+
reason: 'Solicitud con payload excesivamente grande'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'suspicious_user_agent',
|
|
47
|
+
condition: (req) => {
|
|
48
|
+
const userAgent = req.headers['user-agent'] || '';
|
|
49
|
+
// Detectar user agents sospechosos
|
|
50
|
+
const suspiciousAgents = [
|
|
51
|
+
/sqlmap/i,
|
|
52
|
+
/nikto/i,
|
|
53
|
+
/nessus/i,
|
|
54
|
+
/nmap/i,
|
|
55
|
+
/dirbuster/i
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
return suspiciousAgents.some(agent => agent.test(userAgent));
|
|
59
|
+
},
|
|
60
|
+
action: 'block',
|
|
61
|
+
reason: 'User agent sospechoso detectado'
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
logger
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
// Registrar hooks para eventos de firewall
|
|
69
|
+
hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
|
|
70
|
+
logger.info(`[[FIREWALL-HOOK]] Regla activada: ${rule.name} para IP: ${clientIP}`);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
hooks.addAction('firewall_ip_blocked', (ip, reason) => {
|
|
74
|
+
logger.warn(`[[FIREWALL-HOOK]] IP bloqueada: ${ip} por razón: ${reason}`);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
hooks.addAction('firewall_security_event', (event, details) => {
|
|
78
|
+
logger.info(`[[FIREWALL-HOOK]] Evento de seguridad: ${event}`, details);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Aplicar middleware de firewall al servidor
|
|
82
|
+
server.use(firewall.middleware());
|
|
83
|
+
|
|
84
|
+
// Ruta pública
|
|
85
|
+
server.addRoute('GET', '/', (req, res) => {
|
|
86
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
87
|
+
res.end(JSON.stringify({
|
|
88
|
+
message: 'API con funcionalidades de firewall avanzado (v2.1.0)',
|
|
89
|
+
features: [
|
|
90
|
+
'Detección de patrones de ataque (SQL Injection, XSS, Path Traversal)',
|
|
91
|
+
'Bloqueo de IPs tras intentos fallidos',
|
|
92
|
+
'Listas blancas y negras de IPs',
|
|
93
|
+
'Reglas personalizadas de firewall',
|
|
94
|
+
'Sistema de hooks para eventos de seguridad',
|
|
95
|
+
'Monitoreo de solicitudes sospechosas'
|
|
96
|
+
],
|
|
97
|
+
firewallStatus: firewall.getStatus(),
|
|
98
|
+
timestamp: new Date().toISOString()
|
|
99
|
+
}));
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Ruta para probar diferentes tipos de ataques
|
|
103
|
+
server.addRoute('GET', '/test-attacks', (req, res) => {
|
|
104
|
+
// Disparar un hook personalizado para demostrar el sistema
|
|
105
|
+
hooks.doAction('firewall_security_event', 'attack_test_requested', {
|
|
106
|
+
clientIP: firewall.getClientIP(req),
|
|
107
|
+
userAgent: req.headers['user-agent'],
|
|
108
|
+
timestamp: new Date().toISOString()
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
112
|
+
res.end(JSON.stringify({
|
|
113
|
+
message: 'Prueba de ataques completada',
|
|
114
|
+
clientIP: firewall.getClientIP(req),
|
|
115
|
+
securityLevel: 'monitored',
|
|
116
|
+
timestamp: new Date().toISOString()
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Ruta para probar SQL injection (esta debería ser bloqueada)
|
|
121
|
+
server.addRoute('GET', '/test-sql-injection', (req, res) => {
|
|
122
|
+
// Esta ruta no debería ser accesible si se detecta SQL injection en la URL
|
|
123
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
124
|
+
res.end(JSON.stringify({
|
|
125
|
+
message: '¡Esto no debería verse si se detectó SQL injection!',
|
|
126
|
+
status: 'compromised',
|
|
127
|
+
timestamp: new Date().toISOString()
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Ruta para probar XSS (esta debería ser bloqueada)
|
|
132
|
+
server.addRoute('GET', '/test-xss', (req, res) => {
|
|
133
|
+
// Esta ruta no debería ser accesible si se detecta XSS en la URL
|
|
134
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
135
|
+
res.end(JSON.stringify({
|
|
136
|
+
message: '¡Esto no debería verse si se detectó XSS!',
|
|
137
|
+
status: 'compromised',
|
|
138
|
+
timestamp: new Date().toISOString()
|
|
139
|
+
}));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Ruta para probar path traversal (esta debería ser bloqueada)
|
|
143
|
+
server.addRoute('GET', '/test-path-traversal', (req, res) => {
|
|
144
|
+
// Esta ruta no debería ser accesible si se detecta path traversal
|
|
145
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
146
|
+
res.end(JSON.stringify({
|
|
147
|
+
message: '¡Esto no debería verse si se detectó path traversal!',
|
|
148
|
+
status: 'compromised',
|
|
149
|
+
timestamp: new Date().toISOString()
|
|
150
|
+
}));
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Ruta para verificar estado del firewall
|
|
154
|
+
server.addRoute('GET', '/firewall-status', (req, res) => {
|
|
155
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
156
|
+
res.end(JSON.stringify({
|
|
157
|
+
firewall: firewall.getStatus(),
|
|
158
|
+
timestamp: new Date().toISOString()
|
|
159
|
+
}));
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Iniciar el servidor
|
|
163
|
+
server.start();
|
|
164
|
+
|
|
165
|
+
logger.info('Servidor con firewall avanzado iniciado en http://localhost:8097');
|
|
166
|
+
logger.info('Endpoints disponibles:');
|
|
167
|
+
logger.info('- GET / - Página de inicio con información de firewall');
|
|
168
|
+
logger.info('- GET /test-attacks - Prueba de detección de ataques');
|
|
169
|
+
logger.info('- GET /test-sql-injection - Prueba de detección de SQL injection (será bloqueada)');
|
|
170
|
+
logger.info('- GET /test-xss - Prueba de detección de XSS (será bloqueada)');
|
|
171
|
+
logger.info('- GET /test-path-traversal - Prueba de detección de path traversal (será bloqueada)');
|
|
172
|
+
logger.info('- GET /firewall-status - Estado actual del firewall');
|
|
173
|
+
} catch (error) {
|
|
174
|
+
logger.error('Error iniciando el servidor:', error.message);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Iniciar el servidor
|
|
180
|
+
startServer();
|
|
181
|
+
|
|
182
|
+
module.exports = { startServer };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api-sdk-firewall-demo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Ejemplo de API con funcionalidades de firewall avanzado usando el Framework API SDK",
|
|
5
|
+
"main": "app.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "node app.js",
|
|
8
|
+
"dev": "nodemon app.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"api",
|
|
12
|
+
"sdk",
|
|
13
|
+
"firewall",
|
|
14
|
+
"security",
|
|
15
|
+
"advanced",
|
|
16
|
+
"protection",
|
|
17
|
+
"framework"
|
|
18
|
+
],
|
|
19
|
+
"author": "API SDK Framework",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"jsonwebtoken": "^9.0.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"nodemon": "^3.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Ejemplo de Sistema de Hooks en Framework API SDK
|
|
2
|
+
|
|
3
|
+
Este ejemplo demuestra cómo usar el sistema de hooks como el core de WordPress para extender la funcionalidad del Framework API SDK en diferentes puntos del ciclo de vida.
|
|
4
|
+
|
|
5
|
+
## Características del Sistema de Hooks
|
|
6
|
+
|
|
7
|
+
- **Acciones (Actions)**: Puntos de extensión donde se pueden ejecutar funciones
|
|
8
|
+
- **Filtros (Filters)**: Puntos donde se pueden modificar datos antes de ser procesados
|
|
9
|
+
- **Extensibilidad**: Capacidad para agregar funcionalidades en múltiples puntos del ciclo de vida
|
|
10
|
+
- **Ciclo de Vida**: Hooks disponibles en diferentes etapas del proceso
|
|
11
|
+
|
|
12
|
+
## Hooks Disponibles
|
|
13
|
+
|
|
14
|
+
### Hooks de Servidor
|
|
15
|
+
- `framework_init`: Se ejecuta cuando se inicializa el framework
|
|
16
|
+
- `pre_server_start`: Antes de iniciar el servidor
|
|
17
|
+
- `post_server_start`: Después de iniciar el servidor
|
|
18
|
+
|
|
19
|
+
### Hooks de Carga de Rutas
|
|
20
|
+
- `pre_route_load`: Antes de cargar rutas desde archivo
|
|
21
|
+
- `post_route_load`: Después de cargar rutas desde archivo
|
|
22
|
+
|
|
23
|
+
### Hooks de Carga de Controladores
|
|
24
|
+
- `pre_controller_load`: Antes de cargar un controlador
|
|
25
|
+
- `post_controller_load`: Después de cargar un controlador
|
|
26
|
+
|
|
27
|
+
## Configuración
|
|
28
|
+
|
|
29
|
+
No se requieren dependencias adicionales más allá del Framework API SDK.
|
|
30
|
+
|
|
31
|
+
## Uso
|
|
32
|
+
|
|
33
|
+
1. Inicia el servidor:
|
|
34
|
+
```bash
|
|
35
|
+
node app.js
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
2. El servidor escuchará en `http://localhost:8096`
|
|
39
|
+
|
|
40
|
+
## Endpoints
|
|
41
|
+
|
|
42
|
+
- `GET /` - Página de inicio con información del sistema de hooks
|
|
43
|
+
- `GET /hooks-info` - Información sobre el sistema de hooks
|
|
44
|
+
|
|
45
|
+
## Ejemplo de uso de Hooks
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
const { hooks } = require('jerk');
|
|
49
|
+
|
|
50
|
+
// Registrar una acción
|
|
51
|
+
hooks.addAction('nombre_del_hook', (param1, param2) => {
|
|
52
|
+
console.log('Hook ejecutado con:', param1, param2);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Registrar un filtro
|
|
56
|
+
hooks.addFilter('nombre_del_filtro', (valor, parametroAdicional) => {
|
|
57
|
+
return valor + parametroAdicional;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Ejecutar una acción
|
|
61
|
+
hooks.doAction('nombre_del_hook', 'dato1', 'dato2');
|
|
62
|
+
|
|
63
|
+
// Aplicar un filtro
|
|
64
|
+
const resultado = hooks.applyFilters('nombre_del_filtro', 'valorInicial', 'datoAdicional');
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Estructura del proyecto
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
examples/v2.1_hooks_demo/
|
|
71
|
+
├── app.js # Punto de entrada de la aplicación con hooks
|
|
72
|
+
├── routes.json # Definición de rutas
|
|
73
|
+
├── controllers/ # Controladores de las rutas
|
|
74
|
+
│ ├── mainController.js
|
|
75
|
+
│ └── hooksController.js
|
|
76
|
+
└── README.md
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Beneficios del Sistema de Hooks
|
|
80
|
+
|
|
81
|
+
1. **Extensibilidad**: Permite extender la funcionalidad sin modificar el código base
|
|
82
|
+
2. **Modularidad**: Módulos pueden añadir funcionalidades sin interferir entre sí
|
|
83
|
+
3. **Flexibilidad**: Hooks disponibles en múltiples puntos del ciclo de vida
|
|
84
|
+
4. **Personalización**: Capacidad para modificar comportamientos predeterminados
|
|
85
|
+
5. **Integración**: Fácil integración con sistemas de terceros
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejemplo de uso del sistema de hooks en el Framework API SDK
|
|
3
|
+
* Demostrando extensibilidad en diferentes puntos del ciclo de vida
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const jerk = require('../../index.js');
|
|
7
|
+
const {
|
|
8
|
+
APIServer,
|
|
9
|
+
Logger
|
|
10
|
+
} = jerk;
|
|
11
|
+
const RouteLoader = require('../../lib/loader/routeLoader.js');
|
|
12
|
+
const ControllerLoader = require('../../lib/loader/controllerLoader.js');
|
|
13
|
+
const hooks = jerk.hooks;
|
|
14
|
+
|
|
15
|
+
async function startServer() {
|
|
16
|
+
// Crear instancia del servidor
|
|
17
|
+
const server = new APIServer({
|
|
18
|
+
port: 8096,
|
|
19
|
+
host: 'localhost'
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Crear instancia del logger
|
|
23
|
+
const logger = new Logger({ level: 'info' });
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
// Registrar hooks para diferentes eventos del ciclo de vida
|
|
27
|
+
|
|
28
|
+
// Hook que se ejecuta cuando se inicializa el framework
|
|
29
|
+
hooks.addAction('framework_init', () => {
|
|
30
|
+
logger.info('[[FRAMEWORK]] - El framework ha sido inicializado');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Hook que se ejecuta antes de iniciar el servidor
|
|
34
|
+
hooks.addAction('pre_server_start', (serverInstance) => {
|
|
35
|
+
logger.info('[[HOOK]] - Antes de iniciar el servidor');
|
|
36
|
+
logger.info('[[HOOK]] - Puerto configurado:', serverInstance.port);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Hook que se ejecuta después de iniciar el servidor
|
|
40
|
+
hooks.addAction('post_server_start', (serverInstance) => {
|
|
41
|
+
logger.info('[[HOOK]] - Servidor iniciado exitosamente');
|
|
42
|
+
logger.info('[[HOOK]] - Escuchando en:', `http://${serverInstance.host}:${serverInstance.port}`);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Hook que se ejecuta antes de cargar rutas
|
|
46
|
+
hooks.addAction('pre_route_load', (filePath, serverInstance) => {
|
|
47
|
+
logger.info('[[HOOK]] - A punto de cargar rutas desde:', filePath);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Hook que se ejecuta después de cargar rutas
|
|
51
|
+
hooks.addAction('post_route_load', (routes, serverInstance) => {
|
|
52
|
+
logger.info('[[HOOK]] - Rutas cargadas exitosamente:', routes.length, 'rutas');
|
|
53
|
+
routes.forEach((route, index) => {
|
|
54
|
+
logger.info(`[[HOOK]] - Ruta ${index + 1}: ${route.method} ${route.path}`);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Hook que se ejecuta antes de cargar un controlador
|
|
59
|
+
hooks.addAction('pre_controller_load', (controllerPath) => {
|
|
60
|
+
logger.info('[[HOOK]] - A punto de cargar controlador:', controllerPath);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Hook que se ejecuta después de cargar un controlador
|
|
64
|
+
hooks.addAction('post_controller_load', (controllerModule, absolutePath) => {
|
|
65
|
+
logger.info('[[HOOK]] - Controlador cargado exitosamente:', absolutePath);
|
|
66
|
+
// Podríamos inspeccionar las funciones disponibles en el módulo
|
|
67
|
+
const availableHandlers = Object.keys(controllerModule).filter(key =>
|
|
68
|
+
typeof controllerModule[key] === 'function'
|
|
69
|
+
);
|
|
70
|
+
logger.info('[[HOOK]] - Handlers disponibles en el controlador:', availableHandlers);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Ejemplo de uso de filtros
|
|
74
|
+
hooks.addFilter('modify_response_data', (data, endpoint) => {
|
|
75
|
+
// Añadir información de auditoría a todas las respuestas
|
|
76
|
+
return {
|
|
77
|
+
...data,
|
|
78
|
+
_hook_processed: true,
|
|
79
|
+
_timestamp: new Date().toISOString(),
|
|
80
|
+
_endpoint: endpoint
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Cargar rutas desde archivo JSON
|
|
85
|
+
const routeLoader = new RouteLoader();
|
|
86
|
+
await routeLoader.loadRoutes(server, './routes.json');
|
|
87
|
+
|
|
88
|
+
// Iniciar el servidor
|
|
89
|
+
server.start();
|
|
90
|
+
|
|
91
|
+
logger.info('Servidor iniciado con sistema de hooks activo');
|
|
92
|
+
} catch (error) {
|
|
93
|
+
logger.error('Error iniciando el servidor:', error.message);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Iniciar el servidor
|
|
99
|
+
startServer();
|
|
100
|
+
|
|
101
|
+
module.exports = { startServer };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const jerk = require('../../../index.js');
|
|
2
|
+
const hooks = jerk.hooks;
|
|
3
|
+
|
|
4
|
+
const hooksController = {
|
|
5
|
+
getHooksInfo: (req, res) => {
|
|
6
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
7
|
+
res.end(JSON.stringify({
|
|
8
|
+
message: 'Información sobre el sistema de hooks',
|
|
9
|
+
hooksSystem: {
|
|
10
|
+
'actionsRegistradas': hooks.actions ? hooks.actions.size : 0,
|
|
11
|
+
'filtersRegistrados': hooks.filters ? hooks.filters.size : 0,
|
|
12
|
+
'accionesDisponibles': [
|
|
13
|
+
'framework_init',
|
|
14
|
+
'pre_server_start',
|
|
15
|
+
'post_server_start',
|
|
16
|
+
'pre_route_load',
|
|
17
|
+
'post_route_load',
|
|
18
|
+
'pre_controller_load',
|
|
19
|
+
'post_controller_load'
|
|
20
|
+
],
|
|
21
|
+
'ejemploUso': 'hooks.addAction(nombreHook, funcionCallback)',
|
|
22
|
+
'ejemploFiltro': 'hooks.addFilter(nombreFiltro, funcionCallback)'
|
|
23
|
+
},
|
|
24
|
+
timestamp: new Date().toISOString()
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports = hooksController;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const mainController = {
|
|
2
|
+
home: (req, res) => {
|
|
3
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
+
res.end(JSON.stringify({
|
|
5
|
+
message: 'API con sistema de hooks activo',
|
|
6
|
+
features: [
|
|
7
|
+
'Pre/Post hooks para carga de rutas',
|
|
8
|
+
'Pre/Post hooks para carga de controladores',
|
|
9
|
+
'Pre/Post hooks para inicio de servidor',
|
|
10
|
+
'Filtros para modificar datos de respuesta',
|
|
11
|
+
'Extensibilidad en múltiples puntos del ciclo de vida'
|
|
12
|
+
],
|
|
13
|
+
timestamp: new Date().toISOString()
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
module.exports = mainController;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api-sdk-hooks-demo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Ejemplo de API con sistema de hooks para extensibilidad usando el Framework API SDK",
|
|
5
|
+
"main": "app.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "node app.js",
|
|
8
|
+
"dev": "nodemon app.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"api",
|
|
12
|
+
"sdk",
|
|
13
|
+
"hooks",
|
|
14
|
+
"filters",
|
|
15
|
+
"extensibility",
|
|
16
|
+
"wordpress",
|
|
17
|
+
"framework"
|
|
18
|
+
],
|
|
19
|
+
"author": "API SDK Framework",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"jsonwebtoken": "^9.0.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"nodemon": "^3.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"path": "/",
|
|
4
|
+
"method": "GET",
|
|
5
|
+
"controller": "./controllers/mainController.js",
|
|
6
|
+
"handler": "home",
|
|
7
|
+
"auth": "none"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"path": "/hooks-info",
|
|
11
|
+
"method": "GET",
|
|
12
|
+
"controller": "./controllers/hooksController.js",
|
|
13
|
+
"handler": "getHooksInfo",
|
|
14
|
+
"auth": "none"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Ejemplo API con Funcionalidades OpenAPI (v2.1.0)
|
|
2
|
+
|
|
3
|
+
Este ejemplo demuestra cómo crear una API con funcionalidades OpenAPI integradas utilizando el Framework API SDK.
|
|
4
|
+
|
|
5
|
+
## Características de OpenAPI
|
|
6
|
+
|
|
7
|
+
- **Generación automática de documentación OpenAPI 3.0**
|
|
8
|
+
- **Interfaz Swagger UI interactiva**
|
|
9
|
+
- **Definición de esquemas de datos**
|
|
10
|
+
- **Documentación de seguridad y autenticación**
|
|
11
|
+
- **Especificación de endpoints, parámetros y respuestas**
|
|
12
|
+
- **Soporte para diferentes formatos de contenido**
|
|
13
|
+
- **Validación de peticiones y respuestas**
|
|
14
|
+
|
|
15
|
+
## Configuración
|
|
16
|
+
|
|
17
|
+
No se requieren dependencias adicionales más allá del Framework API SDK.
|
|
18
|
+
|
|
19
|
+
## Uso
|
|
20
|
+
|
|
21
|
+
1. Inicia el servidor:
|
|
22
|
+
```bash
|
|
23
|
+
node app.js
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. El servidor escuchará en `http://localhost:8096`
|
|
27
|
+
|
|
28
|
+
## Endpoints
|
|
29
|
+
|
|
30
|
+
- `GET /` - Página de inicio con información de OpenAPI
|
|
31
|
+
- `POST /login` - Iniciar sesión y obtener token
|
|
32
|
+
- `GET /users` - Lista de usuarios (requiere token)
|
|
33
|
+
- `GET /products` - Lista de productos (requiere token)
|
|
34
|
+
- `GET /docs` - Documentación interactiva OpenAPI/Swagger
|
|
35
|
+
- `GET /openapi.json` - Especificación OpenAPI
|
|
36
|
+
|
|
37
|
+
## Ejemplo de uso
|
|
38
|
+
|
|
39
|
+
1. Iniciar sesión:
|
|
40
|
+
```bash
|
|
41
|
+
curl -X POST http://localhost:8096/login \
|
|
42
|
+
-H "Content-Type: application/json" \
|
|
43
|
+
-d '{"username": "admin", "password": "password"}'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. Acceder a usuarios con el token:
|
|
47
|
+
```bash
|
|
48
|
+
curl -X GET http://localhost:8096/users \
|
|
49
|
+
-H "Authorization: Bearer TU_TOKEN_AQUI"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
3. Ver documentación interactiva:
|
|
53
|
+
Visita `http://localhost:8096/docs` en tu navegador
|
|
54
|
+
|
|
55
|
+
4. Obtener especificación OpenAPI:
|
|
56
|
+
```bash
|
|
57
|
+
curl -X GET http://localhost:8096/openapi.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Estructura del proyecto
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
examples/v2.1_openapi_demo/
|
|
64
|
+
├── app.js # Punto de entrada de la aplicación
|
|
65
|
+
├── controllers/ # Controladores de las rutas
|
|
66
|
+
│ ├── mainController.js
|
|
67
|
+
│ ├── authController.js
|
|
68
|
+
│ ├── userController.js
|
|
69
|
+
│ └── productController.js
|
|
70
|
+
└── README.md
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Documentación OpenAPI
|
|
74
|
+
|
|
75
|
+
El framework genera automáticamente:
|
|
76
|
+
|
|
77
|
+
- Una especificación OpenAPI 3.0 en `/openapi.json`
|
|
78
|
+
- Una interfaz Swagger UI interactiva en `/docs`
|
|
79
|
+
- Esquemas de datos definidos para reutilización
|
|
80
|
+
- Documentación detallada de endpoints, parámetros y respuestas
|
|
81
|
+
- Soporte para diferentes códigos de respuesta HTTP
|
|
82
|
+
- Definición de esquemas de seguridad
|