# Checklist de verification securite

## Avant recette

- [ ] Sauvegarder la base puis appliquer `database/migrations/028_security_network_sync.sql`.
- [ ] Definir `APP_ENV=prod`, `APP_DEBUG=false` et `ALLOW_DEMO_USERS=false`.
- [ ] Verifier que le vhost expose uniquement `public/`.
- [ ] Verifier que HTTPS est actif et que le cookie de session porte `Secure`, `HttpOnly` et `SameSite=Lax`.
- [ ] Verifier que `public/uploads/.htaccess` est pris en compte par Apache.

## Authentification et sessions

- [ ] Tester connexion et deconnexion back-office.
- [ ] Tester connexion, inscription et deconnexion boutique.
- [ ] Verifier la regeneration de l'identifiant de session apres connexion.
- [ ] Reduire temporairement `SESSION_IDLE_TIMEOUT_SECONDS`, attendre puis confirmer la deconnexion.
- [ ] Tester au moins 7 mots de passe errones sur le meme compte et confirmer le blocage temporaire.
- [ ] Tester une redirection de connexion vers `//example.org` et confirmer le retour vers `/account`.
- [ ] Confirmer la presence des traces `login_success`, `login_failed`, `login_rate_limited` et `logout` dans `/admin/audit`.

## ACL et isolation multi-tenant

- [ ] Tester `super_admin`, `admin`, `network_manager`, `agency_manager`, `agency_agent`, `graphics_operator` et `production_operator`.
- [ ] Modifier les identifiants `id`, `network_id` et `shop_id` dans les URLs et formulaires pour verifier le refus hors perimetre.
- [ ] Verifier commandes, credits, utilisateurs, boutiques, catalogues, BAT, exports et SSO avec deux reseaux distincts.
- [ ] Confirmer qu'un gestionnaire reseau ne voit aucun utilisateur, commande ou boutique d'un autre reseau.
- [ ] Confirmer qu'un gestionnaire boutique ne voit aucune boutique non autorisee.

## CSRF, XSS et exports

- [ ] Retirer `_csrf` de chaque action POST sensible et confirmer le refus.
- [ ] Soumettre `<script>alert(1)</script>` dans les champs texte puis verifier l'affichage echappe.
- [ ] Tester guillemets, apostrophes, balises HTML et URLs mal formees dans les champs affiches.
- [ ] Exporter un CSV contenant une cellule commencant par `=`, `+`, `-` ou `@` et verifier la neutralisation.
- [ ] Examiner les rapports CSP puis resserrer progressivement la politique.

## Uploads et formulaires publics

- [ ] Envoyer un faux PDF renomme `.pdf` et confirmer le refus.
- [ ] Envoyer un fichier `.php`, `.phtml`, `.svg` ou HTML dans le repertoire uploads et confirmer qu'il n'est pas servi.
- [ ] Tester les limites de taille PHP et applicatives.
- [ ] Remplir le champ honeypot `website` sur inscription et demande de devis, puis confirmer l'absence de creation.
- [ ] Envoyer deux demandes de devis en moins de 30 secondes dans la meme session et confirmer la temporisation.
- [ ] Envoyer des inscriptions repetees depuis la meme adresse IP et confirmer le quota.

## API reseaux

- [ ] Generer une cle dans `/admin/networks/sync?id=ID` et verifier qu'elle n'est affichee qu'une fois.
- [ ] Tester sans Bearer, avec une cle invalide et avec une cle revoquee : reponse `401`.
- [ ] Tester un `Content-Type` different de `application/json` : reponse `415`.
- [ ] Tester un JSON invalide : reponse `400`.
- [ ] Tester un payload trop volumineux et un nombre d'objets trop eleve : reponse `413`.
- [ ] Tester `partial` : creation, modification, desactivation et reactivation d'agence et d'utilisateur.
- [ ] Tester le changement d'agence et verifier `network_user_location_history`.
- [ ] Tester `full` et confirmer que les absents deviennent inactifs sans suppression physique.
- [ ] Tester deux reseaux avec le meme `external_id` et confirmer leur isolation.
- [ ] Tester une collision email ambigue et confirmer le refus sans auto-rattachement.
- [ ] Depasser le quota client et confirmer la reponse `429`.
- [ ] Verifier les statistiques et erreurs dans `/admin/networks/sync?id=ID`.

## Logs techniques

- [ ] Provoquer une erreur controlee en environnement de recette et confirmer l'ajout dans `system_logs`.
- [ ] Verifier qu'aucune stacktrace, erreur SQL ou chemin systeme n'apparait avec `APP_DEBUG=false`.
- [ ] Definir une retention et une purge planifiee pour `audit_logs`, `system_logs` et `network_sync_logs`.

