## Fix sicurezza post-review (2026-07-05) **I1 - Open redirect via backslash in safeNext** - File: src/lib/safe-next.ts - Fix: aggiunto check `if (next && next.includes('\\')) return '/';` in testa alla funzione, prima degli altri controlli. Blocca `/\evil.com` e varianti che i browser normalizzano a `//evil.com`. - Test: tests/safe-next.test.ts, aggiunti 2 case in "rifiuta esterni...": `safeNext('/\\evil.com')` e `safeNext('/\\/evil.com')` → entrambi `'/'`. Verificato TDD: test falliva prima del fix (received `/\evil.com`), verde dopo. **I2 - Ownership guard mancante su /admin/edit/[id]** - File: src/pages/admin/edit/[id].astro - Fix: import `canModifyPost` da '../../../lib/posts', aggiunto dopo il check post-esiste: `const u = Astro.locals.user!;` e `if (!canModifyPost(u.role, u.id, post)) return Astro.redirect('/admin');` - Chiude falla di lettura: prima un utente ruolo 'user' poteva aprire l'edit di post altrui e leggere body/bozze (il salvataggio via API era già protetto a 403, la GET no). **Verifica** - `npm test` → 14 test files, 70 test, tutti verdi (incluso tests/safe-next.test.ts). - `npm run build` → completato senza errori (astro build, adapter node, server mode). - Commit: 7211d74 "fix(sicurezza): safeNext blocca backslash (open redirect) + guardia ownership su /admin/edit"