@zarex/core 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +91 -2
- package/dist/index.cjs +1747 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +559 -0
- package/dist/index.d.ts +559 -0
- package/dist/index.js +1682 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kodjogbe
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,92 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @zarex/core
|
|
2
2
|
|
|
3
|
-
|
|
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
|