# 5. Sécurité

Référence : approche OWASP, moindre privilège, refus par défaut, défense en profondeur et journalisation sans secrets.

## Authentification

- Mots de passe hachés avec `password_hash()` en `PASSWORD_ARGON2ID` si disponible, sinon `PASSWORD_DEFAULT`; paramètres réévalués et `password_needs_rehash()` à la connexion.
- Politique privilégiant longueur et phrases de passe ; contrôle contre les mots de passe compromis si le contexte le permet.
- Message d’erreur identique pour compte inconnu ou mot de passe incorrect.
- Limitation par compte et IP, délai progressif, verrou temporaire et audit des échecs.
- Réinitialisation par jeton aléatoire à usage unique ; seul son hash est stocké, durée courte et invalidation des sessions après changement.
- MFA prévu dans l’architecture pour les administrateurs et opérations sensibles.

## Sessions

- Identifiant généré cryptographiquement, cookie `Secure`, `HttpOnly`, `SameSite=Lax` ou `Strict`, nom non révélateur et portée minimale.
- HTTPS obligatoire en production avec HSTS après validation du domaine.
- Régénération de l’ID après connexion, élévation de privilège et changement de contexte sensible.
- Expiration d’inactivité et absolue ; sessions stockées côté serveur, révocables et visibles par l’utilisateur.
- Aucun identifiant de société ou rôle fiable ne provient uniquement du navigateur ; ils sont vérifiés côté serveur à chaque requête.

## CSRF

- Jeton aléatoire lié à la session sur toute requête modifiant l’état, y compris actions AJAX.
- Comparaison avec `hash_equals()`, rotation raisonnable et rejet avant le contrôleur.
- Les requêtes GET sont sans effet de bord ; cookies SameSite complètent mais ne remplacent pas le jeton.
- Pour une éventuelle API à jeton Bearer, ne pas mélanger authentification cookie et règles API.

## Validation et règles métier

- Liste blanche par DTO : type, longueur, format, plage, devise, précision, dates et valeurs autorisées.
- Validation côté navigateur pour l’ergonomie, toujours répétée côté serveur.
- Identifiants étrangers rechargés et contrôlés dans la société active ; ne jamais faire confiance aux champs cachés.
- Calculs de totaux, taxes, soldes, permissions et transitions uniquement côté serveur.
- Transactions et verrous pour numérotation, paiement, stock et conversion de document.

## Injection SQL

- PDO en mode exceptions, émulation des requêtes préparées désactivée quand le pilote le permet.
- Prepared statements avec paramètres nommés/positionnels pour toutes les valeurs.
- Noms de colonnes, sens de tri et clauses dynamiques sélectionnés dans des listes blanches ; un placeholder ne sécurise pas un identifiant SQL.
- Compte MySQL dédié avec droits nécessaires seulement ; aucun droit global ni usage du compte root.
- Messages SQL détaillés dans les logs privés, réponse générique au client.

## XSS et sorties

- Échappement contextuel à la sortie : `htmlspecialchars(..., ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')` pour HTML.
- Encodage spécifique pour attribut, URL ou JSON ; données injectées dans JavaScript via sérialisation JSON sûre, pas concaténation.
- HTML riche interdit par défaut ; si nécessaire, purification par liste blanche éprouvée.
- Content Security Policy progressive, `X-Content-Type-Options: nosniff`, politique de referrer et restrictions d’iframe.
- Liens externes validés ; `target="_blank"` accompagné de `rel="noopener noreferrer"`.

## Permissions

- RBAC par capacités fines (`sales.invoice.create`, `sales.invoice.validate`, etc.) et policies contextuelles.
- Refus par défaut ; contrôle dans le middleware puis dans le service pour les opérations sensibles.
- Protection contre l’accès horizontal : chaque objet est recherché avec `company_id` et, le cas échéant, entrepôt autorisé.
- Séparation des tâches recommandée : créer/valider, préparer/livrer, saisir/approuver/payer.
- Les exports, rapports, pièces jointes et recherches appliquent exactement les mêmes restrictions.
- Toute dérogation (crédit, stock négatif, remise maximale, annulation) exige une permission dédiée et un audit.

## Journal d’activité

Événements minimaux : connexion, échec, déconnexion, changement de mot de passe, modification des rôles, export, consultation/téléchargement sensible, validation/annulation de document, mouvement de stock, paiement, dépense, transfert, modification de configuration.

Le journal contient acteur, société, horodatage UTC, IP, user-agent, request ID, objet, action et différences utiles. Il exclut mots de passe, jetons, cookies, données bancaires complètes et contenu inutilement sensible. Il est append-only, protégé des utilisateurs ordinaires et soumis à une durée de conservation définie.

## Téléversements et fichiers

- Stockage hors `public/`, nom aléatoire généré côté serveur, extension non fiable.
- Taille, type MIME réel, signature, nombre et catégories autorisées contrôlés.
- Interdire scripts et doubles extensions ; aucune exécution dans le stockage.
- Antivirus si disponible, hash SHA-256, quotas et téléchargement via contrôleur autorisé.
- En-têtes `Content-Disposition` et `Content-Type` sûrs ; noms originaux assainis seulement pour l’affichage.

## Environnement et exploitation

- Secrets dans variables d’environnement, `.env` non versionné, `.env.example` sans secret.
- Erreurs masquées en production, logs tournants protégés, identifiant de corrélation par requête.
- Dépendances PHP/JS verrouillées, inventoriées et mises à jour ; Bootstrap servi localement ou avec SRI si CDN.
- Sauvegardes chiffrées, hors serveur, rétention définie et restauration testée.
- HTTPS, version PHP maintenue, correctifs OS/cPanel, permissions fichiers minimales.
- Cron authentifié par CLI, jamais par URL publique secrète.
- Politique de conservation et droit d’accès/suppression alignés sur la réglementation applicable.

## Contrôles avant mise en production

- tests IDOR inter-société et inter-entrepôt ;
- tests CSRF/XSS/injection et contournement d’upload ;
- tests de concurrence sur numéros, stock et allocations ;
- vérification des en-têtes, cookies et TLS ;
- restauration complète d’une sauvegarde ;
- revue des permissions et comptes techniques ;
- absence de secrets, données de test et logs sensibles dans la livraison.
