# Audit de Sécurité Final - Inscriptions Publiques **Date** : 2026-01-XX **Architecte** : Revue senior avant production ## 🔍 ÉTAPE 1 — AUDIT ### A) Routes publiques #### POST /api/public/events/{event}/registrations - ✅ Rate limiting appliqué (20 req/min par défaut) - ✅ Feature flag vérifié dans `PublicRegistrationRequest::authorize()` → 404 si désactivé - ✅ Réponse minimale (pas de données sensibles) - ⚠️ **PROBLÈME** : Déduplication retourne 422 au lieu de 409 Conflict #### GET /api/public/registrations/verify/{token} - ✅ Rate limiting appliqué (même groupe middleware) - ❌ **PROBLÈME CRITIQUE** : Pas de vérification du feature flag - ✅ Réponse minimale - ✅ Token hashé (SHA256) - ✅ Expiration vérifiée ### B) Déduplication **Comportement actuel** : - `checkDuplicate()` retourne `?Registration` - Si doublon trouvé → `ValidationException` → **422 Unprocessable Entity** - Message : "Une inscription existe déjà pour cet événement avec cet email ou téléphone." **Problème** : - Code HTTP incorrect : 422 = validation error, mais ici c'est un conflit de ressource - Pas de `registration_id` existante dans la réponse - Incohérent avec les standards REST (409 Conflict pour conflits de ressources) **Recommandation** : **Option A - 409 Conflict** avec `registration_id` existante ### C) Promotion guest → participant **Vérification** : - ✅ Token lié à une registration spécifique (`registration_id` dans token) - ✅ Vérification que `registration.status === DRAFT` - ✅ Mise à jour du user associé à cette registration uniquement - ✅ Vérification `hasRole('guest')` avant promotion - ✅ **SÉCURISÉ** : Pas d'élévation de privilège involontaire ### D) Auth & Password flows **Login** : - ✅ Vérifie password avec `Hash::check` - ⚠️ **AMÉLIORATION** : Pas de blocage explicite pour role=guest - Les guests ont un password aléatoire → ne peuvent pas se connecter (sécurité par obscurité) - **Recommandation** : Bloquer explicitement pour clarté et logs **Forgot Password** : - ✅ Pas de route trouvée → Pas de problème **Token Sanctum** : - ✅ Nécessite authentification → Les guests ne peuvent pas générer de token ### E) Tokens de vérification - ✅ Token hashé en SHA256 (jamais stocké en clair) - ✅ Comparaison hashée uniquement - ✅ Token jamais loggé en entier (seulement 8 premiers caractères) - ✅ Expiration vérifiée (`expires_at > now()`) - ✅ Usage unique (`used_at` marqué après utilisation) ## 🔧 ÉTAPE 2 — CORRECTIONS À APPLIQUER ### 1. Ajouter vérification feature flag sur route verify **Priorité** : CRITIQUE **Fichier** : `app/Http/Controllers/PublicRegistrationVerificationController.php` ### 2. Standardiser réponse déduplication → 409 Conflict **Priorité** : HAUTE **Fichier** : `app/Services/RegistrationService.php`, `app/Http/Controllers/PublicRegistrationController.php` **Décision** : **Option A - 409 Conflict** avec `registration_id` existante ### 3. Bloquer explicitement les guests dans login **Priorité** : MOYENNE **Fichier** : `app/Http/Controllers/AuthController.php` ### 4. Ajouter logs de corrélation **Priorité** : MOYENNE **Fichier** : `app/Services/RegistrationService.php` **Ajouter** : `request_id`, `event_id`, `registration_id`, `user_id` dans tous les logs ### 5. Commande artisan pour purger tokens **Priorité** : BASSE (optionnel) **Fichier** : Nouveau `app/Console/Commands/PurgeExpiredVerificationTokens.php` --- ## ✅ DÉCISIONS PRISES 1. **Déduplication** : 409 Conflict avec `registration_id` existante (Option A) 2. **Feature flag verify** : Vérifier dans le controller (pas de FormRequest pour GET) 3. **Login guests** : Bloquer explicitement avec message clair 4. **Logs corrélation** : Utiliser `request()->header('X-Request-ID')` ou générer UUID --- ## 📋 FICHIERS À MODIFIER 1. `app/Http/Controllers/PublicRegistrationVerificationController.php` - Feature flag 2. `app/Services/RegistrationService.php` - Déduplication 409, logs corrélation 3. `app/Http/Controllers/PublicRegistrationController.php` - Gérer 409 4. `app/Http/Controllers/AuthController.php` - Bloquer guests 5. `app/Console/Commands/PurgeExpiredVerificationTokens.php` - Nouveau (optionnel) 6. `routes/console.php` - Ajouter schedule (optionnel) --- ## 🧪 TESTS À AJOUTER 1. Route verify retourne 404 si feature flag désactivé 2. Déduplication retourne 409 avec registration_id 3. Guest ne peut pas se connecter (retourne 403) 4. Logs contiennent request_id