# Vérification de sécurité de Dev App — 9 octobre 2026

Relecture du code (dépôt local `devapp`, version 1.0.3) et contrôle de
l'extérieur de `devapp.if-net.fr`. Aucune correction n'est faite : la liste
est à valider par Loïc avant de corriger (ticket Dev App 303).

## En résumé

Les droits sur les projets sont vérifiés partout, dans l'interface comme dans
l'API. Les points sérieux : **aucune double authentification**, un jeton
d'**intégration** (celui d'If-Panel) trop puissant, et des **pièces jointes
publiques**.

## Constats

| # | Gravité | Constat | Correction proposée |
|---|---|---|---|
| 1 | **Élevée** | **Aucune double authentification**, même pour les administrateurs, qui voient tous les projets, créent des jetons d'API et des comptes. | Double authentification (application ou clé FIDO2), obligatoire pour les administrateurs, proposée aux clients. |
| 2 | **Élevée** | Un jeton d'**intégration** peut créer un **lien de connexion pour n'importe quel compte client** de Dev App (par son adresse e-mail), pas seulement pour les clients de ses propres services. Jeton volé = accès à tous les espaces clients. | Rattacher chaque projet livré au jeton qui l'a créé ; n'accepter que ses projets et les clients de ses projets. |
| 3 | **Élevée** | Les adresses d'intégration (`/integration/services/{référence}`) touchent **tout projet** qui a une référence externe, quel que soit le jeton : lire, modifier, suspendre, **résilier**. | Même correction que le point 2. |
| 4 | Moyenne | Les **pièces jointes** des tickets sont rangées dans le dossier **public** : quiconque a l'adresse d'un fichier l'ouvre sans être connecté, même pour un ticket interne. Le formulaire public de signalement permet aussi à un inconnu de déposer des fichiers servis par le site. | Disque privé, téléchargement par une adresse qui vérifie le droit sur le ticket. |
| 5 | Moyenne | La réponse de l'API pour un ticket inclut le **jeton public du projet** (lien du portail) et l'adresse e-mail de l'auteur. | Ne renvoyer que les champs utiles (ressource dédiée) ; masquer `public_token`. |
| 6 | Faible | Les liens publics (portail, signalement) n'expirent jamais et ne peuvent pas être renouvelés. | Bouton « Renouveler le lien » qui change le jeton. |
| 7 | Faible | Pas d'en-tête **HSTS** ni de **politique de contenu (CSP)**. | Les ajouter. |
| 8 | Faible | Limite de connexion par adresse IP seulement (5 par minute). | Ajouter une limite par compte. |

## Ce qui est solide

- Jetons d'API stockés en **empreinte**, lus dans l'en-tête seulement, avec
  date d'expiration et portée (« complet » ou « intégration ») ; seuls les
  administrateurs en créent.
- Chaque adresse de l'API et de l'interface vérifie le droit sur le projet ;
  pages d'administration réservées au rôle administrateur.
- Le portail public ne montre que les tickets visibles par le client, et
  seulement ceux du projet du lien.
- Types de fichiers limités (ni HTML ni SVG), 10 Mo au plus.
- Sauvegardes téléchargeables seulement par leur nom exact (pas de chemin).
- Cookies `secure` et `httponly` ; `.env` inaccessible de l'extérieur.
- Dépendances sans faille connue ; aucun secret dans le code.
