@zarex/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# @zarex/core
|
|
2
|
+
|
|
3
|
+
Moteur partagé du SDK Zarex — détection locale des données sensibles, résolution fiable de l'IP du visiteur, en-têtes de sécurité, surveillance des réponses, et la logique commune à tous les adaptateurs de framework.
|
|
4
|
+
|
|
5
|
+
> **Dans la plupart des cas, vous n'installez pas ce paquet directement.** Installez plutôt l'adaptateur de votre framework — [`@zarex/express`](https://www.npmjs.com/package/@zarex/express), [`@zarex/fastify`](https://www.npmjs.com/package/@zarex/fastify), [`@zarex/next`](https://www.npmjs.com/package/@zarex/next), [`@zarex/sveltekit`](https://www.npmjs.com/package/@zarex/sveltekit) ou [`@zarex/bun`](https://www.npmjs.com/package/@zarex/bun) — qui dépend déjà de `@zarex/core` et réexporte tout ce dont vous avez besoin. Ce paquet est utile si vous construisez votre propre intégration pour un framework non couvert.
|
|
6
|
+
|
|
7
|
+
## Qu'est-ce que Zarex ?
|
|
8
|
+
|
|
9
|
+
Zarex est une plateforme de sécurité applicative : un service qui protège une application web contre les bots, les abus de trafic, les injections (SQL, XSS, SSRF…) et les fuites de données sensibles. Le SDK s'installe dans votre application ; aucune autre configuration d'infrastructure n'est nécessaire.
|
|
10
|
+
|
|
11
|
+
**Fail-open** : si Zarex est injoignable, lent, ou répond de façon inattendue, la requête du visiteur passe toujours. Une panne chez Zarex ne doit jamais faire tomber votre application.
|
|
12
|
+
|
|
13
|
+
## Ce que fait ce paquet
|
|
14
|
+
|
|
15
|
+
| Domaine | Export principal |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Orchestration des règles | `createZarex(options)` → instance avec `.protect(input, call?)` |
|
|
18
|
+
| Règles disponibles | `shield`, `rateLimit`, `tokenBucket`, `detectBot`, `requestFilter`, `sensitiveInfo`, `emailValidation`, `phoneValidation`, `promptInjection` |
|
|
19
|
+
| Résolution de l'IP visiteur | `createIpResolver(source)` |
|
|
20
|
+
| Détection locale de données sensibles | `detectSensitive`, `findSensitive`, `maskSensitive` |
|
|
21
|
+
| En-têtes autorisés à transmettre | `selectHeaders`, `DEFAULT_FORWARDED_HEADERS`, `NEVER_FORWARD` |
|
|
22
|
+
| En-têtes de sécurité HTTP | `secureHeaders`, `prepareSecureHeaders`, `withSecureHeaders` |
|
|
23
|
+
| Surveillance des réponses sortantes | `guardResponseText`, `applyGuard`, `normalizeGuardOptions` |
|
|
24
|
+
| Aide aux adaptateurs web standards (`Request`/`Response`) | `guardWebRequest`, `protectWebRequest`, `createWebFinalizer` |
|
|
25
|
+
|
|
26
|
+
## Utilisation directe (cas avancé)
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { createZarex, shield, rateLimit } from "@zarex/core";
|
|
30
|
+
|
|
31
|
+
const zarex = createZarex({
|
|
32
|
+
key: process.env.ZAREX_KEY!,
|
|
33
|
+
ipSource: "socket", // obligatoire — voir IpSource ci-dessous
|
|
34
|
+
rules: [shield(), rateLimit({ max: 100, window: "1m" })],
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const decision = await zarex.protect({
|
|
38
|
+
method: "GET",
|
|
39
|
+
path: "/api/produits",
|
|
40
|
+
headers: { "user-agent": "..." },
|
|
41
|
+
socketIp: "41.7.7.7",
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
if (decision.denied) {
|
|
45
|
+
// decision.verdict === "DENY", decision.deniedBy donne la règle responsable
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### `ZarexOptions`
|
|
50
|
+
|
|
51
|
+
| Option | Type | Description |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `key` | `string` | **Obligatoire.** Clé API du projet (jamais journalisée). |
|
|
54
|
+
| `rules` | `Rule[]` | **Obligatoire.** 1 à 10 règles, dans l'ordre d'évaluation. |
|
|
55
|
+
| `ipSource` | `IpSource` | **Obligatoire.** Comment trouver l'IP du visiteur — un mauvais choix fait passer tous vos visiteurs pour une seule adresse. |
|
|
56
|
+
| `timeoutMs` | `number` | Délai maximal avant que la requête ne passe quand même (défaut 500 ms, fail-open). |
|
|
57
|
+
| `breaker` | `BreakerOptions \| false` | Disjoncteur (défaut : 5 échecs → 10 s de pause). `false` pour le désactiver. |
|
|
58
|
+
| `inspectCookies` | `boolean` | Transmettre aussi l'en-tête `Cookie` au Shield (défaut `false` : il contient les sessions de vos visiteurs). |
|
|
59
|
+
| `extraHeaders` | `string[]` | En-têtes additionnels à transmettre (jamais `Authorization` ni `Set-Cookie`, quoi qu'il arrive). |
|
|
60
|
+
| `baseUrl` | `string` | Inutile en usage normal. À ne définir que pour les tests ou un environnement local. |
|
|
61
|
+
|
|
62
|
+
### `IpSource`
|
|
63
|
+
|
|
64
|
+
| Valeur | Quand l'utiliser |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `"socket"` | Pas de proxy devant votre application : l'adresse de la connexion TCP. |
|
|
67
|
+
| `"express"` / `"framework"` | Laissez le framework (Express, Fastify, SvelteKit…) calculer l'IP — utilisé automatiquement par les adaptateurs correspondants. |
|
|
68
|
+
| `"cloudflare"` | Derrière Cloudflare : lit `CF-Connecting-IP`, seulement si la connexion vient réellement de Cloudflare. |
|
|
69
|
+
| `"vercel"` / `"fly"` | Hébergé sur Vercel / Fly.io : lit l'en-tête posé par la plateforme. |
|
|
70
|
+
| `"auto"` | Détecte Vercel/Fly via les variables d'environnement du serveur. |
|
|
71
|
+
| `{ proxies: n }` | `n` proxys de confiance devant votre application (comptés depuis la droite de `X-Forwarded-For`). |
|
|
72
|
+
| `{ trustedProxies: ["10.0.0.0/8", ...] }` | Plages CIDR exactes de vos proxys. |
|
|
73
|
+
|
|
74
|
+
## Règles disponibles
|
|
75
|
+
|
|
76
|
+
| Fonction | Résumé |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `shield(opts?)` | Pare-feu applicatif : injection SQL, XSS, traversée de répertoires, SSRF, SSTI… |
|
|
79
|
+
| `rateLimit(opts)` | Limite le nombre de requêtes par visiteur sur une fenêtre de temps. |
|
|
80
|
+
| `tokenBucket(opts)` | Budget de jetons avec pics autorisés (ex. appels à un modèle d'IA). |
|
|
81
|
+
| `detectBot(opts?)` | Détecte les robots connus, avec vérification DNS inversée pour les robots prétendant être Google/Bing. |
|
|
82
|
+
| `requestFilter(opts)` | Règles personnalisées (`champ opérateur valeur`) sur IP, chemin, en-têtes, cookies, pays... |
|
|
83
|
+
| `sensitiveInfo(opts?)` | Refuse une requête contenant une donnée sensible (carte bancaire, clé API, mot de passe...). |
|
|
84
|
+
| `emailValidation(opts?)` | Valide un email donné via `protect(..., { email })` (jetable, sans MX, faute de frappe...). |
|
|
85
|
+
| `phoneValidation(opts?)` | Valide un numéro donné via `protect(..., { phone })`, orienté opérateurs africains. |
|
|
86
|
+
| `promptInjection(opts?)` | Détecte les tentatives de manipuler un assistant IA, dans un texte donné via `protect(..., { text })`. |
|
|
87
|
+
|
|
88
|
+
Chaque fonction accepte `mode: "LIVE" | "DRY_RUN" | "OFF"` (défaut `"LIVE"`) — `"DRY_RUN"` évalue et journalise sans jamais bloquer, utile pour observer une règle avant de l'activer.
|
|
89
|
+
|
|
90
|
+
## Licence
|
|
91
|
+
|
|
92
|
+
MIT
|