Security Hardening — Correctifs audit du 10/06/2026 #18

Closed
opened 2026-06-10 16:18:29 +00:00 by RiasGFirst · 0 comments
Owner

Objectif

Corriger les failles identifiées dans l'audit de sécurité du 10 juin 2026 (voir AUDIT_SECURITE_RiasBudget.md) avant de poursuivre le développement de M2. Périmètre : failles 1 à 11 — les points 12 (migrations) et 13 (helmet/rate limiting) sont volontairement reportés.

Branche : fix-security-hardening depuis m2-banking-management, à merger sur m2 avant reprise de #10.

Tâches

  • Appliquer isAuthenticated à toutes les routes /api/banks (faille #1)
  • Remplacer le CORS ouvert par une whitelist via FRONTEND_URL (faille #2)
  • Restreindre l'upload : PNG/JPEG/WebP uniquement + limite 2 Mo, double validation MIME + extension (faille #3)
  • Durcir le cookie de session : httpOnly, sameSite: 'lax', secure en prod, trust proxy (faille #4)
  • Remplacer MemoryStore par connect-pg-simple (faille #5)
  • Ajouter un gestionnaire d'erreurs global au format { status, message, data } sans stack trace (faille #6)
  • Créer un middleware validateUuid réutilisable et l'appliquer aux routes /:id (faille #9)
  • Passer PUT /:id en PATCH /:id + rejet du body vide en 400 (faille #10) — mettre à jour test/banks.html et docs/endpoints.md
  • Valider le champ color par regex hex dans le modèle Bank (faille #11)
  • Aligner le volume Docker des uploads via UPLOAD_DIR (faille #7)
  • Sortir les credentials Postgres du compose vers un .env racine + .env.example (faille #8)

Validations

  • Requête sans session sur /api/banks/* → 401 au format unifié
  • Origine hors whitelist → pas de header Access-Control-Allow-Origin
  • Upload .html/.svg ou fichier > 2 Mo → 400 ; .png valide → 201
  • Set-Cookie contient HttpOnly; SameSite=Lax (+ Secure en prod)
  • La session survit à un restart de l'API (table session en base)
  • Erreur serveur → 500 au format unifié, aucune stack trace dans le body
  • GET /api/banks/notAnUuid → 404 (plus de 500)
  • PATCH avec body vide → 400 ; color: "zzzzzzz" → 400
  • Logo persistant après docker compose down && up --build
  • Aucun credential en dur dans docker-compose.yml

Definition of Done

Toutes les validations cochées, test/banks.html et docs/endpoints.md à jour, audit mis à jour (statuts ), branche mergée sur m2-banking-management avec deux commits : fix: security hardening (auth, cors, uploads, sessions, errors) et chore: docker config (uploads volume, postgres credentials).

## Objectif Corriger les failles identifiées dans l'audit de sécurité du 10 juin 2026 (voir `AUDIT_SECURITE_RiasBudget.md`) avant de poursuivre le développement de M2. Périmètre : failles 1 à 11 — les points 12 (migrations) et 13 (helmet/rate limiting) sont volontairement reportés. **Branche :** `fix-security-hardening` depuis `m2-banking-management`, à merger sur `m2` avant reprise de #10. ## Tâches * [x] Appliquer `isAuthenticated` à toutes les routes `/api/banks` (faille #1) * [x] Remplacer le CORS ouvert par une whitelist via `FRONTEND_URL` (faille #2) * [x] Restreindre l'upload : PNG/JPEG/WebP uniquement + limite 2 Mo, double validation MIME + extension (faille #3) * [x] Durcir le cookie de session : `httpOnly`, `sameSite: 'lax'`, `secure` en prod, `trust proxy` (faille #4) * [x] Remplacer MemoryStore par `connect-pg-simple` (faille #5) * [x] Ajouter un gestionnaire d'erreurs global au format `{ status, message, data }` sans stack trace (faille #6) * [x] Créer un middleware `validateUuid` réutilisable et l'appliquer aux routes `/:id` (faille #9) * [x] Passer `PUT /:id` en `PATCH /:id` + rejet du body vide en 400 (faille #10) — mettre à jour `test/banks.html` et `docs/endpoints.md` * [x] Valider le champ `color` par regex hex dans le modèle Bank (faille #11) * [x] Aligner le volume Docker des uploads via `UPLOAD_DIR` (faille #7) * [x] Sortir les credentials Postgres du compose vers un `.env` racine + `.env.example` (faille #8) ## Validations * [x] Requête sans session sur `/api/banks/*` → 401 au format unifié * [x] Origine hors whitelist → pas de header `Access-Control-Allow-Origin` * [x] Upload `.html`/`.svg` ou fichier > 2 Mo → 400 ; `.png` valide → 201 * [x] `Set-Cookie` contient `HttpOnly; SameSite=Lax` (+ `Secure` en prod) * [x] La session survit à un restart de l'API (table `session` en base) * [x] Erreur serveur → 500 au format unifié, aucune stack trace dans le body * [x] `GET /api/banks/notAnUuid` → 404 (plus de 500) * [x] `PATCH` avec body vide → 400 ; `color: "zzzzzzz"` → 400 * [x] Logo persistant après `docker compose down && up --build` * [x] Aucun credential en dur dans `docker-compose.yml` ## Definition of Done Toutes les validations cochées, `test/banks.html` et `docs/endpoints.md` à jour, audit mis à jour (statuts ✅), branche mergée sur `m2-banking-management` avec deux commits : `fix: security hardening (auth, cors, uploads, sessions, errors)` et `chore: docker config (uploads volume, postgres credentials)`.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
RiasNetwork/riasbudget#18
No description provided.