Dhal combine des contrôles déterministes avec des politiques spécifiques aux routes. Commencez en surveillance puis appliquez le blocage aux routes dont le comportement est connu.
Contrôles disponibles
- listes IP autorisées et bloquées ;
- signatures SQLi, XSS, traversée de chemin, SSRF, RCE, SSTI, GraphQL et probes ;
- taille de requête ;
- anomalies d’en-têtes et de type de contenu ;
- sécurité positive JSON ;
- bots et automatisation ;
- honeypots ;
- credential stuffing ;
- limitation et réputation IP.
Packs
generic-web, api, auth, wordpress et strict-api.
{
"rules": {
"packs": ["generic-web", "api"],
"sqli": true,
"xss": true,
"pathTraversal": true
}
}Consultez le catalogue avec npx dhal rules.
Profils de route
{
"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"]
}
}
}
}
}Les motifs acceptent les chemins exacts et le joker *. Si plusieurs motifs correspondent, Dhal choisit le plus spécifique selon sa longueur hors jokers.
{
"routes": {
"/api/admin/*": { "mode": "strict" },
"/api/public/*": { "mode": "monitor" }
}
}Faux positifs
Pour les bots, ajustez scoreThreshold, minSignals, allowUserAgents, skipStaticAssets et ignorePaths avant de désactiver la règle globalement.
Activez rules.api globalement uniquement pour les services exclusivement JSON ; sinon utilisez un profil de route.
Suppressions
{
"policy": {
"suppressions": [
{
"id": "scanner-interne",
"enabled": true,
"ruleId": "honeypot.triggered",
"path": "/.well-known/security-canary",
"reason": "scanner interne approuvé",
"expiresAt": "2027-01-01T00:00:00.000Z"
}
]
}
}Les suppressions restent visibles dans l’audit. Rendez-les précises, justifiées et temporaires.