La décision
Ce que Zarex renvoie pour chaque requête, et comment le lire dans votre code.
Pour chaque requête, le SDK obtient une décision. Vous la recevez dans onDeny et onDegraded, dans req.zarex (Express, Fastify), dans locals.zarex (SvelteKit), ou en retour de protect.
Champs
| Champ | Type | Signification |
|---|---|---|
allowed | boolean | true : la requête passe. Toujours true si Zarex n'a pas pu décider. |
denied | boolean | true : une règle en LIVE a refusé la requête. |
verdict | "ALLOW" · "DENY" | Le verdict. Quand Zarex n'a pas pu décider, il vaut "ALLOW" et degraded est true. |
degraded | boolean | true : Zarex n'a pas pu décider (indisponible, trop lent, adresse IP introuvable…) et la requête a été laissée passer. |
id | string | Identifiant de la décision (32 caractères hexadécimaux), à retrouver dans le journal du dashboard. Vide ("") si Zarex n'a pas répondu. |
results | RuleOutcome[] | Le résultat de chaque règle. |
deniedBy | RuleOutcome | La première règle qui a refusé la requête (hors DRY_RUN). |
retryAfterSeconds | number | Pour une limite de débit : secondes à attendre avant de réessayer. |
ip | string | L'adresse IP du visiteur utilisée pour la décision. |
ipInfo | { country, asn } | Pays (code ISO, "ZZ" si inconnu) et réseau ("AS15169", "AS0" si inconnu) de cette adresse. |
error | { code, message } | La raison, quand la décision est degraded. |
Le résultat d'une règle
Chaque élément de results (et deniedBy) contient :
| Champ | Signification |
|---|---|
ruleType | Le type de règle : SHIELD, RATE_LIMIT, TOKEN_BUCKET, BOT_DETECTION, REQUEST_FILTER, SENSITIVE_INFO, EMAIL_VALIDATION, PHONE_VALIDATION ou PROMPT_INJECTION. |
verdict | Le verdict de cette règle : "ALLOW", "DENY", ou "ERROR" si la règle n'a pas pu être évaluée (par exemple une vérification DNS impossible) ; une règle en ERROR ne bloque jamais. |
dryRun | true si la règle est en DRY_RUN : son verdict n'a rien bloqué. |
reason | Le détail, propre à chaque type de règle. |
Exemple : adapter le message à la règle
onDeny: (req, res, decision) => {
switch (decision.deniedBy?.ruleType) {
case "RATE_LIMIT":
return res.status(429).json({ erreur: "Trop de tentatives, réessayez plus tard." });
case "EMAIL_VALIDATION":
return res.status(400).json({ erreur: "Cette adresse e-mail ne peut pas être utilisée." });
default:
return res.status(403).json({ erreur: "Requête refusée." });
}
},Ne montrez pas le détail au visiteur
reason sert à vous, dans vos logs ou le dashboard. Au visiteur, un message générique suffit : inutile d'indiquer à un attaquant quelle règle l'a arrêté.