Dhal combina controles deterministas con políticas específicas por ruta. Comienza en monitorización y aplica bloqueos donde el comportamiento de la aplicación sea conocido.
Controles incluidos
- listas IP permitidas y bloqueadas;
- firmas de SQLi, XSS, traversal, SSRF, RCE, SSTI, GraphQL y probes;
- tamaño de solicitud;
- anomalías de cabeceras y tipo de contenido;
- seguridad positiva para APIs JSON;
- bots y automatización;
- honeypots;
- credential stuffing;
- límites de solicitudes y reputación IP.
Paquetes de reglas
generic-web, api, auth, wordpress y strict-api.
{
"rules": {
"packs": ["generic-web", "api"],
"sqli": true,
"xss": true,
"pathTraversal": true
}
}Revisa el catálogo con npx dhal rules.
Perfiles de ruta
{
"mode": "monitor",
"routes": {
"/api/login": {
"mode": "block",
"tags": ["authentication"],
"rateLimit": {
"enabled": true,
"windowSeconds": 60,
"max": 20,
"keyBy": ["ip", "route"]
},
"rules": {
"credentialStuffing": {
"enabled": true,
"windowSeconds": 300,
"maxFailures": 4,
"keyBy": ["ip", "route", "userAgent"]
}
}
}
}
}Los patrones admiten rutas exactas y comodines *. Si coinciden varios, se selecciona el patrón más específico según su longitud sin comodines.
{
"routes": {
"/api/admin/*": { "mode": "strict" },
"/api/public/*": { "mode": "monitor" }
}
}Falsos positivos de bots
Usa scoreThreshold, minSignals, allowUserAgents, skipStaticAssets e ignorePaths antes de desactivar la protección globalmente.
APIs JSON
Activa rules.api en servicios solo JSON o en perfiles de ruta específicos. Puedes exigir content-type, limitar profundidad y número de claves, y definir métodos con cuerpo.
Supresiones
{
"policy": {
"suppressions": [
{
"id": "scanner-interno",
"enabled": true,
"ruleId": "honeypot.triggered",
"path": "/.well-known/security-canary",
"reason": "escáner interno aprobado",
"expiresAt": "2027-01-01T00:00:00.000Z"
}
]
}
}Las supresiones permanecen en los metadatos de auditoría. Hazlas estrechas, documentadas y con fecha de expiración.