Aller au contenu
ZarexDocs

SvelteKit

Protégez une application SvelteKit avec le hook serveur @zarex/sveltekit.

Installation

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

Protéger l'application

src/hooks.server.ts
import { zarexHandle, shield, rateLimit } from "@zarex/sveltekit";

export const handle = zarexHandle({
  key: process.env.ZAREX_KEY!,
  rules: [shield(), rateLimit({ max: 100, window: "1m" })],
});

Avec d'autres hooks, combinez-les avec sequence :

src/hooks.server.ts
import { sequence } from "@sveltejs/kit/hooks";
import { zarexHandle, shield } from "@zarex/sveltekit";

export const handle = sequence(
  zarexHandle({ key: process.env.ZAREX_KEY!, rules: [shield()] }),
  monAutreHandle
);

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

L'adresse IP du visiteur

Zarex utilise event.getClientAddress(), donné par votre adaptateur de déploiement. Avec adapter-node derrière un proxy, réglez les variables ADDRESS_HEADER et XFF_DEPTH ; avec les autres adaptateurs, voir leur documentation.

Identifiants et données de formulaire

src/hooks.server.ts
export const handle = zarexHandle({
  key: process.env.ZAREX_KEY!,
  rules: [rateLimit({ max: 100, window: "1m", characteristics: ["userId"] })],
  call: (event) => ({ characteristics: { userId: event.locals.user?.id } }),
});

call peut aussi fournir email, phone, text et tokensRequested. Les identifiants sont hachés (SHA-256) avant l'envoi.

Lire la décision

La décision est disponible dans locals.zarex :

src/routes/+page.server.ts
export function load({ locals }) {
  console.log(locals.zarex?.verdict); // "ALLOW" | "DENY"
}

Personnaliser le refus

zarexHandle({
  key: process.env.ZAREX_KEY!,
  rules: [shield()],
  onDeny: (event, decision) =>
    new Response("Requête refusée", { status: 403 }),
});

onDeny doit toujours renvoyer une Response : c'est elle qui est envoyée au visiteur. Si elle n'en renvoie pas (un return oublié, par exemple), le SDK envoie la réponse de refus par défaut et le signale dans vos logs : la requête reste bloquée (depuis la version 0.1.4).

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

secureHeaders: true et responseGuard: true s'appliquent automatiquement à toutes les réponses, sans autre réglage.

Sur cette page