# 01 — Plan de sécurisation

Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3

> Contexte : plateforme ministérielle manipulant des **données personnelles**
> (comptes citoyens, ressources privées, échanges modérés). La sécurité et la
> conformité **RGPD** sont donc des exigences fortes.

## 1. Identification des risques de sécurité

Analyse inspirée du **Top 10 OWASP** et adaptée au projet.

| Risque | Exemple sur le projet | Gravité | Traitement mis en place |
|--------|-----------------------|---------|-------------------------|
| Injection SQL | Recherche / filtres de ressources | Élevée | ORM Eloquent (requêtes préparées), validation des entrées |
| XSS (injection de scripts) | Commentaires, ressources créées par les citoyens | Élevée | Échappement Blade `{{ }}`, en-tête **CSP** |
| CSRF | Formulaires (login, création de ressource) | Élevée | Jeton CSRF Laravel automatique sur les formulaires |
| Vol de session | Cookies de session | Élevée | Cookies `HttpOnly` + `Secure`, HTTPS forcé, `session.regenerate()` à la connexion |
| Mots de passe faibles / en clair | Comptes citoyens | Élevée | Hachage **bcrypt** (`hashed` cast), min. 8 caractères |
| Contrôle d'accès défaillant | Accès Back Office / pages profil | Élevée | Middleware `auth`, rôles (Citoyen / Modérateur / Admin / Super-Admin) |
| Man-in-the-middle | Transport des données | Élevée | **TLS/HTTPS** obligatoire + **HSTS** |
| Exposition d'informations | Messages d'erreur, debug | Moyenne | `APP_DEBUG=false` et `APP_ENV=production` en prod |
| Clickjacking | Intégration en iframe | Moyenne | En-tête `X-Frame-Options: SAMEORIGIN` |
| Dépendances vulnérables | Paquets Composer / npm | Moyenne | `composer audit` / mises à jour régulières |

## 2. Mesures de prévention des risques

### 2.1 Sécurité applicative (implémentée dans le code)

- **Authentification** : hachage bcrypt des mots de passe, régénération de
  session à la connexion, invalidation à la déconnexion
  (`app/Http/Controllers/LoginController.php`).
- **Contrôle d'accès** : les routes sensibles sont regroupées derrière le
  middleware `auth` (`routes/web.php`), avec un modèle de **rôles**
  (`app/Models/Role.php`).
- **Validation des entrées** : toutes les données reçues sont validées
  (règles `required`, `email`, `unique`, `min:8`, `confirmed`…).
- **Protection CSRF** : activée par défaut sur tous les formulaires POST/PUT.
- **En-têtes de sécurité HTTP** (`app/Http/Middleware/SecurityHeaders.php`) :
  - `Strict-Transport-Security` (HSTS) — impose HTTPS,
  - `Content-Security-Policy` (CSP) — limite les sources de scripts (anti-XSS),
  - `X-Content-Type-Options: nosniff`,
  - `X-Frame-Options: SAMEORIGIN` (anti-clickjacking),
  - `Referrer-Policy` et `Permissions-Policy`.
- **Forçage HTTPS** (`app/Http/Middleware/ForceHttps.php`) : redirection
  automatique de HTTP vers HTTPS hors environnement local/test.

### 2.2 Sécurité du transport et de l'infrastructure

- **TLS/HTTPS** terminé au niveau du reverse proxy (`nginx.conf`) : le port 80
  redirige en 301 vers le port 443.
- Nom de domaine du service : `https://app.sam-coffre.duckdns.org`.
- Séparation des rôles conteneurs : PHP-FPM (`laravel_php`) et serveur web
  (`laravel_web`) isolés (`docker-compose.yml`).

## 3. Chiffrement des données

| Donnée | État au repos | En transit |
|--------|---------------|-----------|
| Mots de passe | Hachage **bcrypt** (non réversible) | HTTPS |
| Sessions / cookies | Chiffrés via `APP_KEY` (AES-256), `SESSION_ENCRYPT=true` en prod | HTTPS + cookie `Secure`/`HttpOnly` |
| Données personnelles sensibles | Chiffrables via les *casts* `encrypted` d'Eloquent | HTTPS |
| Communications client ↔ serveur | — | **TLS 1.2+** obligatoire |

> Laravel chiffre en **AES-256-CBC** à partir de la clé `APP_KEY`. Cette clé est
> stockée hors dépôt (`.env` est dans `.gitignore`) et ne doit jamais être versionnée.

## 4. Conformité RGPD

- **Minimisation** : seules les données nécessaires sont collectées (pseudo, e-mail).
- **Base légale et information** : pages légales présentes
  (`resources/views/legal/mentions.blade.php`,
  `resources/views/legal/politique.blade.php`).
- **Droit d'accès / rectification** : espace profil
  (`/profile/settings`, `ProfileController`).
- **Droit à l'effacement / anonymisation** : implémenté. Depuis son espace
  profil, l'utilisateur peut supprimer son compte (confirmation par mot de passe) ;
  ses données personnelles (e-mail, pseudo, mot de passe) sont alors anonymisées
  de façon irréversible via `Utilisateur::anonymiser()`
  (`app/Http/Controllers/ProfileController@destroy`), tout en préservant
  l'intégrité référentielle des contributions.
- **Sécurité par défaut** (privacy by design) : chiffrement, HTTPS, contrôle d'accès.
- **Sous-traitance et hébergement** : hébergement maîtrisé, journalisation des accès.

## 5. Bonnes pratiques de développement

- **Style de code homogène** : **Laravel Pint** (PSR-12), vérifié en CI
  (`vendor/bin/pint --test`).
- **Commentaires** : le code de sécurité (middlewares) est documenté en français.
- **Tests automatisés** : `tests/Feature/SecuriteTest.php` vérifie les en-têtes
  de sécurité et le contrôle d'accès aux pages protégées.
- **Séparation des environnements** : configuration via `.env` (jamais de secret en dur).
- **Architecture MVC** : contrôleurs / modèles / vues séparés.

## 6. Synthèse — traçabilité risque → mesure

Chaque risque du §1 est couvert par au moins une mesure du §2/§3/§4, et les
mesures critiques (en-têtes, contrôle d'accès) sont **vérifiées automatiquement**
par la CI à chaque évolution du code.
