Filtres
Écrivez vos propres conditions pour autoriser ou refuser une requête selon son IP, son pays, son chemin ou ses en-têtes.
Les filtres couvrent ce que les autres règles ne font pas : réserver une zone d'administration à certaines adresses, refuser un pays, bloquer un client HTTP précis… Chaque condition compare un champ de la requête à une valeur.
Le problème
Certaines règles sont propres à votre activité, et aucune protection générique ne peut les deviner : votre back-office ne doit être accessible que depuis le bureau, votre boutique ne livre que dans certains pays, un réseau d'hébergement n'envoie que des attaques, une ancienne version de votre application ne doit plus appeler l'API.
Ce qu'ils permettent
- réserver une zone, comme l'administration, à des adresses connues ;
- restreindre ou refuser des pays ou des réseaux (ASN) ;
- bloquer un client, un en-tête ou un paramètre précis ;
- fonctionner en liste blanche : tout refuser, sauf ce que vous autorisez.
Quand l'utiliser
Quand vous savez précisément qui doit, ou ne doit pas, accéder à une route.
Configuration
import { requestFilter } from "@zarex/express"; // ou le paquet de votre framework
rules: [
requestFilter({
conditions: [
{ field: "path", operator: "STARTS_WITH", value: "/admin", action: "DENY" },
],
}),
],Champs
| Champ | Contenu |
|---|---|
ip | Adresse IP du visiteur. Avec IN / NOT_IN, les plages CIDR sont acceptées ("10.0.0.0/8"). |
ip.country | Pays de l'adresse IP, code ISO ("BJ", "SN"…). "ZZ" = inconnu. |
ip.asn | Réseau de l'adresse IP ("AS15169"). "AS0" = inconnu. |
path | Chemin de la requête. |
method | Méthode HTTP (GET, POST…). |
host | Nom de domaine demandé. |
headers.<nom> | Un en-tête, par exemple headers.user-agent. |
query.<nom> | Un paramètre d'URL. |
cookies.<nom> | Un cookie. Nécessite l'option inspectCookies: true. |
Opérateurs
| Opérateur | Signification |
|---|---|
EQ · NE | égal · différent |
IN · NOT_IN | dans la liste values · hors de la liste |
CONTAINS · STARTS_WITH | contient · commence par |
LIKE | motif avec * (n'importe quelle suite) et ? (un caractère), par exemple "/admin/*" |
REGEX | expression régulière |
LEN_EQ · LEN_GT · LEN_LT | longueur égale à · supérieure à · inférieure à |
Les comparaisons ne tiennent pas compte de la casse. ip.country et ip.asn acceptent seulement EQ, NE, IN et NOT_IN.
Options
| Option | Valeurs | Rôle |
|---|---|---|
conditions | de 1 à 32 conditions | Obligatoire. Chaque condition : field, operator, value ou values, action ("DENY" par défaut, ou "ALLOW"), et not: true pour l'inverser. |
logic | "OR" · "AND" | Défaut "OR" : la première condition vraie décide. Avec "AND", toutes doivent être vraies. |
default | "ALLOW" · "DENY" | Ce qui arrive à une requête qu'aucune condition ne reconnaît. Défaut "ALLOW". |
mode | "LIVE" · "DRY_RUN" · "OFF" | Défaut "LIVE". |
Exemples
Réserver l'administration à votre bureau :
requestFilter({
conditions: [
{ field: "ip", operator: "IN", values: ["203.0.113.0/24"], action: "ALLOW" },
{ field: "path", operator: "STARTS_WITH", value: "/admin", action: "DENY" },
],
}),N'accepter que certains pays :
requestFilter({
conditions: [
{ field: "ip.country", operator: "IN", values: ["BJ", "TG", "CI", "SN"], action: "ALLOW" },
],
default: "DENY",
}),ALLOW n'exempte pas des autres règles
Une condition ALLOW reconnaît la requête pour ce filtre seulement : le Shield, la limitation de débit et les autres règles s'appliquent quand même.