# PTA V7.8 — Correctifs de sécurité et descente des droits en base Cette version ne change aucune règle métier. Elle corrige les failles relevées lors de l'audit et déplace l'intégralité des règles d'accès dans la base. ## Failles corrigées ### 1. phpMyAdmin ouvert sans mot de passe (critique) `docker-compose.yml` fournissait `PMA_USER` et `PMA_PASSWORD` au conteneur phpMyAdmin. Ces deux variables font basculer phpMyAdmin en `auth_type=config` : toute personne atteignant le port arrivait sur une session **déjà authentifiée**, avec accès complet en lecture et en écriture à la base. Le `.env` publiait de surcroît ce port sur `0.0.0.0`, donc sur tout le réseau. Les deux variables ont été retirées et le port est revenu sur `127.0.0.1`. phpMyAdmin réclame désormais un identifiant MariaDB à chaque connexion. Pour y accéder depuis un poste distant : `ssh -L 8081:127.0.0.1:8081 utilisateur@serveur`. ### 2. XSS stocké via les attributs HTML `PTA.utils.escapeHtml` s'appuyait sur `textContent` / `innerHTML`, qui n'échappent ni `"` ni `'`. La fonction était pourtant utilisée dans une vingtaine de contextes d'attribut (`value="…"`, `title="…"`, `aria-label="…"`). Un libellé contenant un guillemet permettait de sortir de l'attribut et d'injecter du script. Les vecteurs réalistes étaient les libellés de vacances scolaires — importés depuis une API externe — ainsi que les noms de lieux, les noms d'agents, les libellés de diplôme et les commentaires PTA. `escapeHtml` échappe désormais les cinq caractères et reste valable en contexte texte comme en contexte attribut. L'implémentation dupliquée `escapeAttr` de `annual-overview.js` a été supprimée au profit de la fonction commune. ### 3. Règles de refus nginx sans effet Les blocs interdisant `config.php`, `db.php` et `page_bootstrap.php` étaient placés **après** `location ~ \.php$`. nginx retenant la première expression régulière correspondante, ces refus n'ont jamais été appliqués : les trois fichiers d'amorçage étaient exécutables depuis le navigateur. L'ordre des blocs a été corrigé et la couverture élargie (`/docker/`, fichiers `.env`, `.sql`, `.ini`, `.log`, `.md`). ### 4. Divulgation d'informations techniques `PTA_DEBUG` valait `1` par défaut : le message des exceptions — requêtes SQL, noms de tables, chemins serveur — était renvoyé au navigateur. Les pages d'erreur de `page_bootstrap.php` et de `role.php` affichaient de la même façon `getMessage()`, et `db.php` y ajoutait l'hôte, l'utilisateur et le nom de la base issus du message PDO. Le mode debug est désormais désactivé par défaut. Tout détail technique est journalisé côté serveur via `App\Core\Security::reportThrowable()` et n'atteint le client que si `PTA_DEBUG` est explicitement activé. ### 5. Absence d'en-têtes de sécurité Les réponses HTML portent maintenant une `Content-Security-Policy` **à nonce** : `script-src 'self' 'nonce-…'`, sans `unsafe-inline`. PTA ne contient aucun gestionnaire d'événement inline ni style inline, la politique peut donc rester stricte. S'y ajoutent `X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`, `Permissions-Policy`, `Cross-Origin-Opener-Policy` et, en HTTPS, `Strict-Transport-Security`. Tout nouveau `