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. |
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. |
trustedOriginsest limité à l'origineBASE_URLpropre à 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 unredirectTod'origine externe lors de la réinitialisation de mot de passe.useSecureCookiesest activé en production. La barrière CSRF et les cookies sécurisés se dégradent silencieusement siNODE_ENVn'est pas défini, de sorte qu'un risque deNODE_ENVmanquant est révélé bruyamment dans la bannière de démarrage de production (et supprimé en dev pour garder la sortie propre).
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 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, vérifications au niveau de l'objet. |
Pages connexes
- Aperçu de l'authentification — stratégies d'authentification et le bloc
auth. - Sessions — durée de vie des sessions, révocation, cookies sécurisés.
- Rôles & RBAC — modèle de rôle et permissions par champ.
- Permissions de table — contrôle d'accès par table et par champ.
- Tableau de bord d'administration — la surface de lecture 404-en-cas-de-non-autorisation.
- GDPR & Confidentialité — garanties d'export et d'effacement des données.
- Variables d'environnement —
NODE_ENV,BASE_URLet réglages associés.