
# Durcissement de la sécurité

Sovrium conçoit pour éliminer les modes de défaillance récurrents des applications non sécurisées — surfaces exposées, authentification manquante, autorisation au niveau de l'objet cassée, points de terminaison énumérables — à la couche de la plateforme, de sorte que chaque application hérite des défenses sans configuration par application. Chaque réponse HTTP porte un ensemble d'en-têtes durcis, le CSRF est appliqué en production, les points de terminaison sensibles sont limités en débit et l'accès non autorisé renvoie `404` plutôt que `403`.

Ces garanties sont appliquées **dans le code** (pas seulement à l'entrée du proxy inverse), de sorte qu'elles tiennent même pour un déploiement auto-hébergé sans proxy attaché.

## En-têtes de sécurité HTTP

Chaque réponse — page, API, asset statique ou `404` — porte un ensemble d'en-têtes durcis, appliqué via le middleware `secureHeaders` de Hono enregistré comme **premier** middleware `*` afin qu'il s'exécute avant la correspondance de route et couvre les réponses d'erreur.

| En-tête                               | Valeur / comportement                                                                                           |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `Strict-Transport-Security`           | `max-age=31536000; includeSubDomains` (HSTS d'un an, couvre les sous-domaines).                                 |
| `X-Content-Type-Options`              | `nosniff` (désactive le sniffing MIME).                                                                         |
| `X-Frame-Options`                     | `SAMEORIGIN` / `DENY` (anti-détournement de clic).                                                              |
| `Referrer-Policy`                     | `strict-origin-when-cross-origin`.                                                                              |
| `Cross-Origin-Opener-Policy`          | `same-origin`.                                                                                                  |
| `Cross-Origin-Resource-Policy`        | `same-origin`.                                                                                                  |
| `Permissions-Policy`                  | Refuse la caméra, le microphone, la géolocalisation, le paiement, l'usb, l'accéléromètre, …                     |
| `Content-Security-Policy-Report-Only` | `default-src 'self'`, `frame-ancestors 'none'`, `object-src 'none'`, `base-uri 'self'`, `form-action 'self'`, … |
| `Content-Security-Policy` (appliqué)  | **Absent** — report-only d'abord ; la CSP appliquée à base de nonce est une promotion de Phase 2.               |

:::callout
**La CSP est livrée en report-only d'abord.** Elle fait remonter les violations sans bloquer pendant que la couche SSR émet encore des `<script>`/`<style>` en ligne. L'en-tête appliqué est délibérément absent pour l'instant, et une spécification verrouille cette absence afin qu'un basculement prématuré fasse échouer la CI. Les directives dans le code reflètent le filet de sécurité de l'entrée Caddy afin que les deux couches s'accordent.
:::

HSTS est émis sans condition même sur du HTTP en clair — les navigateurs l'ignorent sur une connexion `http://`, et un proxy de terminaison TLS transmet exactement la valeur que le serveur produit.

## Application CSRF & Cross-Origin

Sovrium s'appuie sur le middleware de vérification d'origine intégré de Better Auth. Une requête modifiant l'état, porteuse de cookies, dont l'`Origin` est falsifié ou supprimé est rejetée — une falsification inter-sites ne peut pas chevaucher le cookie de session d'une victime.

| Environnement          | `disableCSRFCheck` | Comportement                                                                         |
| ---------------------- | ------------------ | ------------------------------------------------------------------------------------ |
| `NODE_ENV=development` | `true`             | Vérification d'origine contournée — `Origin` falsifié accepté (DX cross-port local). |
| `NODE_ENV=production`  | `false`            | Vérification d'origine active — `Origin` falsifié / manquant rejeté `403`.           |

- `trustedOrigins` est limité à l'origine `BASE_URL` propre à l'application — **jamais** `'*'`. Un caractère générique est un contournement de redirection ouverte / de validation d'origine ; le limiter fait aussi que Better Auth rejette un `redirectTo` d'origine externe lors de la réinitialisation de mot de passe.
- `useSecureCookies` est activé en production. La barrière CSRF et les cookies sécurisés se dégradent silencieusement si `NODE_ENV` n'est pas défini, de sorte qu'un risque de `NODE_ENV` manquant est révélé **bruyamment** dans la bannière de démarrage de production (et supprimé en dev pour garder la sortie propre).

:::callout
**Définissez `NODE_ENV=production` en production.** L'application CSRF et les cookies sécurisés en dépendent tous deux. Lorsqu'elle n'est pas définie, le serveur avertit bruyamment dans la bannière de démarrage — tenez-en compte avant la mise en ligne.
:::

## Limitation de débit

Sovrium remplace la limitation de débit native de Better Auth (bugs amont connus) par un middleware Hono personnalisé sur les points de terminaison sensibles.

| Point de terminaison                    | Limite                          | Fenêtre |
| --------------------------------------- | ------------------------------- | ------- |
| `POST /api/auth/sign-in/email`          | 5 tentatives                    | 60 s    |
| `POST /api/auth/sign-up/email`          | 5 tentatives                    | 60 s    |
| `POST /api/auth/request-password-reset` | 3 tentatives                    | 60 s    |
| `POST /api/auth/admin/*`                | Limite de débit générale par IP | —       |

Dépasser une limite renvoie `429 Too Many Requests`. Les routes d'administration exécutent en plus un middleware de vérification d'authentification qui renvoie `401` **avant** la validation des paramètres, de sorte qu'un appelant non authentifié n'apprend jamais la forme d'un point de terminaison protégé.

## Anti-énumération : 404, pas 403

L'accès non autorisé à une ressource protégée renvoie **`404 Not Found`**, jamais `403 Forbidden`. Un `403` confirme que la ressource existe ; un `404` rend l'existence de la ressource — et l'espace des id — inobservable. Cela s'applique uniformément aux lectures d'enregistrements, au [tableau de bord d'administration](/fr/docs/admin-dashboard) et au point de terminaison de suppression forcée par table (qui renvoie `404` lorsque la suppression forcée n'est pas autorisée pour cette table).

L'autorisation au niveau de l'objet est appliquée avant l'exécution de toute logique sensible : une requête est authentifiée, puis vérifiée pour l'accès à l'objet spécifique, et en cas d'échec renvoie `404`. Combiné à des id indevinables, cela déjoue l'énumération même si le `404` lui-même est observable.

## Synthèse défense en profondeur

| Préoccupation               | Mécanisme                                                                                       |
| --------------------------- | ----------------------------------------------------------------------------------------------- |
| Sécurité du transport       | HSTS (`max-age=31536000; includeSubDomains`).                                                   |
| MIME / détournement de clic | `nosniff`, `X-Frame-Options`.                                                                   |
| Isolation cross-origin      | COOP + CORP `same-origin`, CSP report-only.                                                     |
| CSRF                        | Vérification d'origine Better Auth (production), `trustedOrigins` limité.                       |
| Force brute                 | Limitation de débit par point de terminaison (`429`).                                           |
| Énumération                 | `404`-pas-`403`, id indevinables, vérification d'authentification avant validation.             |
| Autorisation                | RBAC + [permissions par champ](/fr/docs/table-permissions), vérifications au niveau de l'objet. |

## Pages connexes

- [Aperçu de l'authentification](/fr/docs/auth-overview) — stratégies d'authentification et le bloc `auth`.
- [Sessions](/fr/docs/auth-sessions) — durée de vie des sessions, révocation, cookies sécurisés.
- [Rôles & RBAC](/fr/docs/auth-roles-rbac) — modèle de rôle et permissions par champ.
- [Permissions de table](/fr/docs/table-permissions) — contrôle d'accès par table et par champ.
- [Tableau de bord d'administration](/fr/docs/admin-dashboard) — la surface de lecture 404-en-cas-de-non-autorisation.
- [GDPR & Confidentialité](/fr/docs/gdpr-privacy) — garanties d'export et d'effacement des données.
- [Variables d'environnement](/fr/docs/env-vars) — `NODE_ENV`, `BASE_URL` et réglages associés.
