mirror of
https://github.com/R0m1k3/PleinR.git
synced 2026-10-21 06:08:04 +02:00
Durcissement : mot de passe actuel, sessions révocables, dépendances, CSP, tests
Suite de l'audit : les cinq points laissés en suspens sont traités. Mot de passe - `changeOwnPassword` exige désormais le mot de passe actuel. Un poste laissé ouvert ne suffit plus à s'approprier un compte. Les erreurs reviennent sur l'écran avec un message au lieu d'une page d'erreur brute. Sessions révocables - Colonne `users.session_version`, portée dans le jeton et comparée à la base. - `getSession()` (src/lib/session.ts) remplace `auth()` sur les 20 pages et actions : rôle, rattachement adhérent et existence du compte sont relus à chaque requête. Supprimer un compte ou réinitialiser un mot de passe coupe immédiatement les sessions ouvertes, sans attendre l'expiration du jeton. Dépendances — de 8 vulnérabilités (2 critiques) à zéro - next 15.5.19 → 15.5.21, next-auth beta.25 → beta.32, drizzle-orm 0.38 → 0.45. - postcss et sharp forcés par `overrides` sur leurs versions corrigées, Next ne les ayant pas encore reprises ; drizzle-kit et esbuild montés côté outillage. - `npm audit fix --force` a été écarté : il proposait de RÉTROGRADER Next en 9.3.3 et eslint-config-next en 12, ce qui aurait cassé l'application. - `eslint-config-next` traînait dans node_modules sans être déclaré : retiré. CSP complète - Politique à nonce posée par le middleware, nonce régénéré à chaque requête, `script-src` sans 'unsafe-inline'. `style-src` garde 'unsafe-inline' : tout le design repose sur des attributs style, et une injection de style n'a pas la portée d'une injection de script. - Conséquence assumée : rendu dynamique pour toutes les pages, un HTML pré-généré ne pouvant pas porter de nonce. Tests - `npm test` (runner natif node:test via tsx), 18 tests sur le filtre XSS, la limitation des tentatives de connexion et le chiffrement des jetons. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
This commit is contained in:
36 files changed
+2151
-6053
No files matched your search
@@ -33,7 +33,7 @@ docker compose up --build # full stack
|
||||
design-system in `src/app/globals.css` (palette as CSS vars, fonts, twinkle/float
|
||||
animations, hover lifts, responsive grid helpers). No Tailwind.
|
||||
- **Mutations**: server actions in `src/app/backend/actions.ts`. Each action
|
||||
re-checks auth + capability via `auth()` and `can()` before writing, then
|
||||
re-checks auth + capability via `getSession()` and `can()` before writing, then
|
||||
`revalidatePath()`.
|
||||
- **Access control**: `src/middleware.ts` gates `/backend/*`; each page further
|
||||
guards by role (`isStaff`, `can`) and redirects.
|
||||
@@ -83,6 +83,22 @@ site sans traitement supplémentaire.
|
||||
- Les URLs publiques des pages FB/LinkedIn sont des `site_settings`
|
||||
(`association_facebook`, `association_linkedin`), éditables dans Paramètres.
|
||||
|
||||
## Sécurité
|
||||
|
||||
- Le journal d'activité agrège des saisies de tiers, dont le formulaire de
|
||||
contact **public** : il est filtré à l'écriture (`sanitizeActivityMessage`) et
|
||||
rendu en éléments React (`activityNodes`), jamais en HTML brut.
|
||||
- `getSession()` (`src/lib/session.ts`) remplace `auth()` partout : le rôle et le
|
||||
rattachement adhérent sont relus en base à chaque requête, et
|
||||
`users.session_version` invalide les jetons émis avant un changement de mot de
|
||||
passe. N'appelez plus `auth()` directement depuis une page ou une action.
|
||||
- Les images ne sont acceptées qu'en data-URI (`asImageDataUri`) : une URL ferait
|
||||
appeler par le serveur une cible choisie par l'utilisateur (SSRF).
|
||||
- La CSP à nonce est posée par `src/middleware.ts`. Elle impose un rendu
|
||||
dynamique : `export const dynamic = "force-dynamic"` est dans `app/layout.tsx`,
|
||||
un HTML pré-généré ne pouvant pas porter de nonce.
|
||||
- `npm test` verrouille ces protections (`tests/security.test.ts`).
|
||||
|
||||
## Roles
|
||||
|
||||
`admin` > `moderator` > `editor` are staff; `member` is an adhérent linked to a
|
||||
|
||||
Reference in new issue
Block a user