Aller au contenu
ZarexDocs

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

ChampTypeSignification
allowedbooleantrue : la requête passe. Toujours true si Zarex n'a pas pu décider.
deniedbooleantrue : 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.
degradedbooleantrue : Zarex n'a pas pu décider (indisponible, trop lent, adresse IP introuvable…) et la requête a été laissée passer.
idstringIdentifiant de la décision (32 caractères hexadécimaux), à retrouver dans le journal du dashboard. Vide ("") si Zarex n'a pas répondu.
resultsRuleOutcome[]Le résultat de chaque règle.
deniedByRuleOutcomeLa première règle qui a refusé la requête (hors DRY_RUN).
retryAfterSecondsnumberPour une limite de débit : secondes à attendre avant de réessayer.
ipstringL'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 :

ChampSignification
ruleTypeLe type de règle : SHIELD, RATE_LIMIT, TOKEN_BUCKET, BOT_DETECTION, REQUEST_FILTER, SENSITIVE_INFO, EMAIL_VALIDATION, PHONE_VALIDATION ou PROMPT_INJECTION.
verdictLe 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.
dryRuntrue si la règle est en DRY_RUN : son verdict n'a rien bloqué.
reasonLe 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é.

Sur cette page