Autenticazione e autorizzazioni: due controlli diversi che ogni web app deve fare 🔐

Autenticazione e autorizzazioni

Quando si parla di sicurezza di una web app, spesso si sente dire: “Gli utenti fanno login, quindi l’accesso è protetto”. Ma autenticazione e autorizzazione non sono la stessa cosa. Confonderle può lasciare aperta una porta anche in un’applicazione che usa password robuste e una schermata di login ben fatta.

La domanda da porsi è doppia: chi è l’utente? E, una volta identificato, che cosa è autorizzato a fare? La prima riguarda l’autenticazione, la seconda l’autorizzazione.

Autenticazione: chi sei? 👤

L’autenticazione verifica l’identità dell’utente. Può avvenire tramite password, passkey, autenticazione federata o altri meccanismi. Una web app deve gestire anche sessioni, scadenze, recupero dell’account e procedure di logout.

Alcuni controlli utili da considerare:

  • password memorizzate con una funzione di hashing adatta, mai in chiaro;
  • procedure di recupero account progettate per non diventare una scorciatoia per gli attaccanti;
  • cookie di sessione configurati con attributi di sicurezza adeguati;
  • protezione contro tentativi automatizzati di accesso;
  • autenticazione a piĂš fattori per account sensibili, quando appropriato.

Un login riuscito dice chi è l’utente secondo l’applicazione. Non dimostra ancora che possa leggere o modificare qualsiasi dato.

Autorizzazione: che cosa puoi fare? 🚦

L’autorizzazione stabilisce quali risorse e operazioni sono consentite a un utente autenticato. Per esempio: un cliente può vedere i propri ordini, un operatore può gestire gli ordini assegnati e un amministratore può configurare il sistema.

Un errore comune è affidarsi soltanto a controlli nell’interfaccia. Nascondere un pulsante non impedisce a qualcuno di inviare direttamente una richiesta all’endpoint. Le verifiche devono essere eseguite anche sul server, ogni volta che si accede a una risorsa o si compie un’azione protetta.

Il classico problema degli IDOR 🕵️

Immagina un indirizzo come /ordini/1842. Se l’applicazione mostra l’ordine dopo aver verificato soltanto che l’utente abbia effettuato il login, un utente potrebbe provare a cambiare il numero e accedere a un ordine che appartiene a qualcun altro.

Il problema non è che l’identificativo sia facile da indovinare. Anche un identificativo difficile da prevedere non sostituisce il controllo dei permessi. Il server deve verificare che la risorsa richiesta appartenga all’utente o che il suo ruolo consenta quell’accesso.

In pseudocodice, l’idea è semplice:

ordine = recuperaOrdine(id)

if ordine.proprietarioId != utente.id and not utente.puoGestireOrdini:
    restituisciErroreAccessoNegato()

La logica concreta cambia da progetto a progetto, ma la regola resta: non fidarti dell’ID fornito dal browser; controlla sempre l’autorizzazione sul server.

Ruoli e permessi: evita il “tutti admin” 🧩

Un sistema di ruoli può aiutare a organizzare i permessi, ma va progettato in base alle reali esigenze. Creare un ruolo “admin” per risolvere ogni problema è rapido, ma spesso concede più potere del necessario.

Per ogni funzione, chiediti:

  • quali utenti devono poterla usare?
  • su quali dati possono operare?
  • possono solo leggere o anche modificare?
  • ci sono operazioni che richiedono una conferma aggiuntiva?
  • il permesso viene controllato in ogni endpoint interessato?

È utile applicare il principio del privilegio minimo: concedere soltanto i permessi necessari al ruolo e all’attività, evitando accessi amministrativi permanenti quando non servono.

Come verificare i controlli 🧪

La documentazione OWASP Web Security Testing Guide include aree dedicate alla gestione delle identità, all’autenticazione e ai controlli di autorizzazione. Può essere un riferimento strutturato per organizzare i test di un’applicazione web.

Per una verifica iniziale, puoi creare account di prova con ruoli diversi e controllare che:

  • un utente non autenticato non acceda alle funzioni protette;
  • un utente standard non possa eseguire operazioni riservate agli amministratori;
  • un utente non possa leggere i dati di un altro modificando URL o parametri;
  • le API applichino gli stessi controlli dell’interfaccia web;
  • gli errori non rivelino dettagli interni o dati di altri account.

Fai questi test soltanto su sistemi di tua proprietà o per cui hai un’autorizzazione esplicita. L’analisi di sicurezza deve avere un perimetro chiaro, non trasformarsi in una scansione improvvisata di siti altrui.

Non dimenticare i test automatici 🤖

I test automatici possono proteggere le regole di accesso da regressioni future. Per esempio, una suite di test può verificare che un utente con ruolo “cliente” riceva un errore quando tenta di consultare la risorsa di un altro cliente.

Conviene testare sia gli accessi consentiti sia quelli negati. Un test che dimostra che un amministratore può gestire una risorsa non basta: bisogna verificare anche che un utente senza quel permesso venga bloccato.

Una checklist prima di pubblicare ✅

  • Le password e le sessioni sono gestite in modo sicuro?
  • Ogni endpoint protetto verifica l’identitĂ  e i permessi richiesti?
  • La proprietĂ  delle risorse viene controllata sul server?
  • I ruoli hanno soltanto i privilegi necessari?
  • Le API sono testate separatamente dall’interfaccia?
  • Esistono test per gli accessi non autorizzati?

Un login non è un lasciapassare universale 🎯

Autenticazione e autorizzazione collaborano, ma risolvono problemi diversi. Sapere chi è l’utente è il primo passo; decidere quali dati e operazioni può raggiungere è il controllo che evita molte esposizioni accidentali.

Quando progetti una web app, pensa ai permessi fin dall’inizio e verifica i controlli direttamente sul server. È meno spettacolare di una nuova animazione nella dashboard, ma protegge ciò che per gli utenti conta davvero: i loro dati 🔒

Vuoi aggiungere qualcosa?

Il tuo indirizzo email non sarĂ  pubblicato. I campi obbligatori sono contrassegnati *