# FranCoach — Security checklist

## Applicazione

- [x] CSRF attivo sul gruppo `web`; tutte le azioni mutative usano metodi non GET e token CSRF
- [x] Output Blade escaped di default; nessun HTML utente renderizzato con sintassi non escaped
- [x] Query Eloquent/query builder con binding; wildcard di ricerca SQL neutralizzate
- [x] Form Request con allowlist, tipi, lunghezze, enum e riferimenti `exists`
- [x] Mass assignment limitato tramite `$fillable` e selezione esplicita dei campi nei service
- [x] Policy e middleware di ruolo su risorse coach/atleta
- [x] Controlli di appartenenza sulle risorse annidate e ULID sulle entità esposte
- [x] Login limitato per e-mail normalizzata e IP
- [x] Endpoint privacy limitati per utente/IP e funzione
- [x] Session ID rigenerato al login; sessione invalidata e token CSRF rigenerato al logout
- [x] Cookie sessione cifrato, `Secure`, `HttpOnly`, `SameSite=Lax` per impostazione predefinita
- [x] HTTPS obbligatorio in produzione con origine ricavata da `APP_URL`
- [x] Proxy attendibili limitati da `TRUSTED_PROXIES`
- [x] Header `nosniff`, `SAMEORIGIN`, HSTS, Referrer Policy, Permissions Policy, COOP e CORP
- [x] CSP con `default-src 'self'`, script locali e frame video su allowlist
- [x] Upload validati per MIME, dimensione e contenuto immagine decodificabile
- [x] Nomi file casuali; fotografie su storage privato e servite da controller autorizzato
- [x] Varianti foto selezionate tramite allowlist; nessun percorso richiesto dall’utente
- [x] Redirect post-login basato solo sulla destinazione interna di sessione
- [x] `APP_DEBUG=false` e log non verbosi nel template di produzione
- [x] Pagine errore non dettagliate disponibili per produzione
- [x] Cache disabilitata sulle aree autenticate, privacy, foto ed esportazioni

## Audit

- [x] Login, logout e login falliti registrati
- [x] Profilo, esercizi, schede, assegnazioni, correzioni, progressi, foto, impostazioni e report registrati
- [x] Identificativo evento ULID, attore, soggetto, azione, entità, IP, user agent, metodo, percorso e timestamp
- [x] Valori precedenti e successivi filtrati centralmente
- [x] Password, token, contatti, dati corporei, note e percorsi file oscurati
- [x] Model audit append-only

## Dipendenze

- [x] `composer audit --locked`: nessun advisory
- [x] Toolchain Vite aggiornata
- [x] `npm audit`: nessuna vulnerabilità

## Verifiche di rilascio

- [ ] Configurare un certificato TLS valido e redirect HTTP→HTTPS anche sul web server
- [ ] Impostare `APP_URL`, `ASSET_URL`, `SESSION_DOMAIN` e `TRUSTED_PROXIES` per l’hosting reale
- [ ] Confermare `APP_ENV=production`, `APP_DEBUG=false`, `SESSION_SECURE_COOKIE=true`, `SESSION_ENCRYPT=true`
- [ ] Puntare la document root a `public/` e negare accesso web a `.env`, `storage/`, `vendor/` e backup
- [ ] Applicare permessi filesystem minimi a `storage/` e `bootstrap/cache/`
- [ ] Impostare rotazione, accesso e conservazione dei log
- [ ] Eseguire backup cifrati e prova periodica di ripristino
- [ ] Definire cancellazione effettiva, anonimizzazione, conservazione e legal hold
- [ ] Sottoporre privacy, termini e trattamento dati relativi alla salute a revisione legale professionale

## Rischi residui dichiarati

- `style-src 'unsafe-inline'` resta necessario per gli stili inline attuali; rimuoverlo richiede una revisione delle view.
- Le copertine degli esercizi sono pubbliche perché non contengono dati personali; le fotografie progressi restano private.
- Il prodotto è progettato per un coach e un atleta. Un’estensione multi-coach richiederà scoping tenant esplicito in tutte le policy e query.
- La cancellazione è una richiesta confermata e tracciata, non una cancellazione automatica: l’esecuzione deve seguire una procedura legale approvata.

## Deployment e continuità operativa

- [x] Backup database, file e fotografie fuori document root.
- [x] SHA-256, verifica profonda, rotazione e cifratura AES-256 opzionale.
- [x] Comando manuale e scheduler senza worker permanente.
- [x] Storage pubblico configurabile senza symlink.
- [x] Template installer no-SSH non eseguibile per default, protetto da HTTPS, token, IP e lock.
- [ ] Passphrase conservata separatamente e copia off-site configurata.
- [ ] Ripristino completo provato in ambiente isolato.
- [ ] Script installer e token rimossi dopo il deploy.
- [ ] Document root, permessi, HTTPS, SMTP e cron verificati sull’hosting reale.
