Aller au contenu
ZarexDocs

Express

Protégez une application Express avec le middleware @zarex/express.

Installation

npm install @zarex/express
.env
ZAREX_KEY=zarex_test_...

Protéger l'application

server.ts
import express from "express";
import { zarex, shield, rateLimit } from "@zarex/express";

const app = express();

app.use(
  zarex({
    key: process.env.ZAREX_KEY!,
    rules: [shield(), rateLimit({ max: 100, window: "1m" })],
  })
);

app.get("/", (req, res) => res.send("ok"));
app.listen(3000);

Le middleware peut aussi protéger une seule route : app.post("/connexion", zarex({ ... }), handler).

Une requête refusée reçoit automatiquement 403, ou 429 avec Retry-After.

L'adresse IP du visiteur

Zarex utilise req.ip, calculé par Express selon le réglage trust proxy. Derrière un proxy (load balancer, nginx, Cloudflare…), réglez-le selon votre infrastructure réelle :

app.set("trust proxy", 1); // un proxy de confiance devant Express

Sans ce réglage derrière un vrai proxy, tous vos visiteurs semblent venir de la même adresse, et la limitation de débit par IP ne fonctionne plus.

Analyser le corps des requêtes

Par défaut, le corps n'est jamais transmis à Zarex. Pour que le Shield ou la détection de données sensibles l'analysent, activez inspectBody et placez le middleware après express.json() :

app.use(express.json());
app.use(zarex({ key: process.env.ZAREX_KEY!, inspectBody: true, rules: [shield()] }));

Identifiants et données de formulaire

call fournit, pour chaque requête, ce que Zarex ne peut pas deviner : l'identifiant de l'utilisateur, l'e-mail ou le téléphone à valider, le texte à analyser.

app.use(authMiddleware); // avant Zarex, pour que req.user existe

app.post(
  "/inscription",
  zarex({
    key: process.env.ZAREX_KEY!,
    rules: [rateLimit({ max: 5, window: "10m", characteristics: ["userId"] }), emailValidation()],
    call: (req) => ({
      characteristics: { userId: req.user?.id },
      email: req.body.email,
    }),
  }),
  handler
);

Les identifiants sont hachés (SHA-256) avant l'envoi. Une erreur dans call est ignorée : la requête continue.

Lire la décision

La décision est disponible dans req.zarex, que la requête ait été autorisée ou non :

app.get("/", (req, res) => {
  if (req.zarex?.degraded) console.warn("Zarex n'a pas pu décider");
  res.send("ok");
});

Voir la décision pour tous ses champs.

Personnaliser le refus

zarex({
  key: process.env.ZAREX_KEY!,
  rules: [shield()],
  onDeny: (req, res, decision) => {
    res.status(403).json({ erreur: "Requête refusée", id: decision.id });
  },
});

En-têtes de sécurité et réponses

OptionEffet
secureHeaders: trueAjoute HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy… à toutes les réponses, et retire X-Powered-By.
responseGuard: trueSurveille les réponses de votre application (res.send, res.json) et masque les cartes bancaires, clés API ou jetons qui s'y retrouveraient par erreur. Tout se passe sur votre serveur.

responseGuard ne couvre pas res.write() / res.end() appelés directement, ni les flux.

Sur cette page