Audit de l'application. Cinq corrections, la première critique.
XSS stocké non authentifié (critique)
- Le journal d'activité était rendu avec `dangerouslySetInnerHTML` alors qu'il
agrège des saisies de tiers : titre de promotion d'un adhérent, et surtout nom
laissé dans le formulaire de contact PUBLIC. N'importe quel visiteur pouvait
donc faire exécuter du script dans le navigateur d'un administrateur, et
prendre la main sur son compte.
- Défense aux deux bouts : `sanitizeActivityMessage` ne laisse passer que
<strong> à l'écriture, et `activityNodes` rend le message en éléments React —
un message déjà stocké en base ne peut plus rien injecter.
SSRF
- `loadPromoImage` allait chercher toute URL http(s) placée dans le champ image
d'une promotion, et en poussait le contenu vers Facebook ou LinkedIn : de quoi
atteindre un service interne ou les métadonnées de l'hébergeur. Seules les
data-URI sont désormais acceptées, ce qui couvre tous les usages réels.
- Les images sont en plus validées à l'écriture (type et taille), côté promotion
comme côté profil adhérent.
Authentification
- Aucun frein sur la connexion : blocage progressif après 8 échecs par compte.
- La comparaison bcrypt est menée même sans compte correspondant, sinon le temps
de réponse révélait quelles adresses existent.
Aléa
- Les mots de passe temporaires venaient de `Math.random()`, prédictible :
passage à `randomInt` de node:crypto, et longueur portée à 12.
En-têtes
- nosniff, X-Frame-Options, Referrer-Policy, Permissions-Policy et
frame-ancestors. Une CSP complète demandera des nonces sur les scripts Next.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
- Champs upload image d'entete (coverUrl) et logo (logoUrl) dans le
formulaire d'edition d'un adherent (composant ImageField, fichier ->
data-URL via hidden input)
- updateMember persiste desormais coverUrl + logoUrl, et revalide la
fiche publique /adherents/[id]
- serverActions.bodySizeLimit a 4mb (les data-URL depassent la limite
par defaut de 1mb)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>