Protezione CSRF e prevenzione della manomissione dei moduli

Scopri gli attacchi CSRF e come i token impediscono di dirottare i tuoi moduli. Perché ogni modulo ha bisogno della protezione CSRF.

Bozza

Immagina che qualcuno convinca un visitatore a cliccare su un link mentre è collegato al conto della sua banca. Il link porta a un modulo nascosto che, all'insaputa del visitatore, invia alla banca la richiesta di fare un bonifico. La banca vede una richiesta legittima da un utente autenticato e la esegue. Chi attacca ha spostato denaro usando il conto della vittima senza mai conoscere la sua password.

Questo è il CSRF (Cross-Site Request Forgery): un attacco in cui qualcuno induce una vittima a inviare, senza saperlo, un modulo o una richiesta a un altro sito in cui la vittima ha già effettuato l'accesso.

Che cosa imparerai: che cosa sono gli attacchi CSRF e come funzionano, perché sono così pericolosi anche quando ci sono altre misure di sicurezza, come i token CSRF li prevengono e come proteggere i tuoi moduli.

Che cos'è il CSRF?

CSRF (si legge "si-surf") sta per Cross-Site Request Forgery. È un attacco che sfrutta un fatto: se hai effettuato l'accesso a un sito, il tuo browser si fida automaticamente della tua sessione e la include in ogni richiesta che fai a quel sito, anche se la richiesta arriva da un altro sito.

L'attacco funziona inducendo un visitatore connesso a inviare, senza saperlo, un modulo a un sito in cui ha un account. Chi attacca non può vedere la password della vittima. Non gli serve. Gli basta che la vittima sia già connessa, e poi la induce a fare una richiesta (come inviare un modulo nascosto) che fa ciò che vuole l'attaccante.

Il CSRF è diverso dagli altri attacchi perché non richiede di rubare credenziali o di rompere la crittografia. Sfrutta la fiducia della vittima nel sito. La vittima è già autenticata, quindi il sito si fida delle richieste che sembrano arrivare da lei.

Come funzionano gli attacchi CSRF

Un attacco CSRF avviene in tre passaggi.

Passaggio 1: la vittima è connessa al tuo sito

Qualcuno visita il tuo sito e accede al suo account. Il suo browser ora ha un cookie di sessione attivo che dimostra che è autenticato. La sessione resta attiva finché continua a usare il sito.

Passaggio 2: chi attacca lo induce a visitare una pagina malevola

Mentre è ancora connessa al tuo sito, la vittima visita una pagina controllata dall'attaccante (magari un link sui social, una pubblicità ingannevole o un sito dall'aspetto legittimo). Su quella pagina c'è un codice nascosto che invia un modulo al tuo sito.

Passaggio 3: il modulo si invia da solo usando la sessione della vittima

Il modulo nascosto viene inviato al tuo sito. Poiché la vittima è già connessa, il suo browser include automaticamente il cookie di sessione nella richiesta. Dal punto di vista del tuo modulo, è una richiesta legittima di un utente autenticato. Il modulo la elabora come se la vittima l'avesse inviata di proposito.

Ora chi attacca ha fatto qualcosa sul tuo sito usando l'account della vittima, senza che lei lo sapesse. Può aver cambiato la password, trasferito denaro, aggiornato il profilo o inviato dati.

Perché funziona anche con altre misure di sicurezza

Gli attacchi CSRF aggirano diverse funzioni di sicurezza comuni:

L'HTTPS non ferma il CSRF. I dati sono cifrati durante il trasferimento, ma l'attaccante non ha bisogno di intercettarli. Invia la richiesta dal browser della vittima, di cui il browser si fida già.

La protezione con password non ferma il CSRF. L'attaccante non ha mai bisogno della password della vittima. Sfrutta il fatto che la vittima è già connessa.

Un buon sistema di accesso non ferma il CSRF. Anche se l'autenticazione è perfetta, se la vittima è connessa l'attacco funziona.

Per questo la protezione dal CSRF è un livello a sé. Le altre misure di sicurezza non la garantiscono. Devi progettare i moduli in modo specifico per resistere agli attacchi CSRF.

Token CSRF: come fermano l'attacco

La soluzione è un token CSRF. È una stringa unica e imprevedibile che il tuo server genera per ogni modulo. Funziona così:

Il tuo server crea un token unico per ogni visitatore

Quando qualcuno carica una pagina con un modulo, il server genera un token casuale e lo associa alla sessione di quell'utente. Il token è diverso ogni volta ed è unico per quell'utente.

Il token è inserito nel modulo

Il token è incluso come campo nascosto nel modulo HTML. Quando il visitatore invia il modulo, il token viaggia insieme ai dati.

Il tuo server verifica il token prima di elaborare l'invio

Quando il modulo viene inviato, il server controlla se il token ricevuto corrisponde a quello generato per la sessione di quell'utente. Se sì, il modulo viene elaborato. Se no (o se manca il token), il modulo viene respinto.

Il modulo nascosto dell'attaccante non può includere un token valido, perché i token sono imprevedibili e unici per ogni sessione. Chi attacca da un altro dominio non può vedere né indovinare il token. Quindi l'attacco fallisce. Il modulo nascosto viene inviato, ma il tuo server lo respinge perché il token non corrisponde.

Che aspetto ha un token CSRF nella pratica

In HTML, un modulo protetto dal CSRF si presenta così:

<form method="POST" action="/submit-form"> <input type="hidden" name="csrf_token" value="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"> <input type="email" name="email" placeholder="Your email"> <button type="submit">Submit</button> </form>

Il campo `csrf_token` è nascosto. Il visitatore non lo vede, ma viene inviato insieme ai dati del modulo. Il tuo server lo controlla prima di elaborare l'email o qualsiasi altro dato.

Protezione CSRF per i diversi tipi di modulo

Moduli HTML tradizionali

I moduli HTML standard (quelli che inviano i dati al server con POST) hanno bisogno dei token CSRF. Questo vale per i moduli di contatto, di accesso, di reimpostazione della password e per ogni modulo che modifica dati sul tuo server.

Moduli AJAX e JavaScript

Anche i moduli inviati con JavaScript a un endpoint API hanno bisogno della protezione CSRF. Il token può essere inserito nel modulo stesso, salvato in un cookie o letto da un meta tag prima di inviare la richiesta.

Richieste API senza stato

Se la tua API usa l'autenticazione con token (come JWT), la protezione CSRF funziona in modo diverso. Il browser non può allegare automaticamente un token JWT come fa con un cookie di sessione, quindi il CSRF tradizionale è una minaccia minore. La buona pratica resta comunque aggiungere un token CSRF per una protezione extra.

Altre protezioni che lavorano con i token CSRF

I token CSRF sono la difesa principale, ma funzionano meglio insieme ad altre pratiche di sicurezza.

Cookie SameSite

Quando imposti un cookie di sessione, puoi aggiungere l'attributo `SameSite`, che dice al browser di non includere il cookie quando la richiesta arriva da un altro dominio. In questo modo il modulo nascosto dell'attaccante non può usare affatto la sessione della vittima.

Controllo dell'header Referer

Il tuo server può controllare l'header Referer per vedere da dove arriva la richiesta. Se un invio dichiara di arrivare dal tuo dominio ma il Referer indica un altro dominio, probabilmente è un attacco. (Gli header Referer però si possono falsificare, quindi questa non è una difesa completa.)

Schema del cookie a doppio invio

In questo approccio il token CSRF viene salvato sia in un cookie sia in un campo del modulo. Il server controlla che coincidano prima di elaborare i dati. È meno comune dei token tradizionali, ma funziona bene per le applicazioni senza stato.

Come implementare la protezione CSRF

I dettagli dipendono dalla tua tecnologia, ma lo schema è lo stesso:

  1. Genera un token unico per sessione. Quando un utente avvia una sessione o carica una pagina con un modulo, il tuo backend genera un nuovo token.
  2. Salva il token lato server. Conservalo associato alla sessione di quell'utente.
  3. Includi il token nel modulo. Aggiungilo come campo nascosto nell'HTML o come meta tag che JavaScript può leggere.
  4. Convalida all'invio. Prima di elaborare i dati del modulo, controlla che il token inviato corrisponda a quello salvato per quella sessione.
  5. Rigenera dopo le azioni sensibili. Dopo che un utente cambia la password o fa qualcosa di critico, genera un nuovo token.

La maggior parte dei framework moderni gestisce in automatico la generazione e la convalida dei token CSRF. Se usi un framework, di solito la protezione CSRF è attiva di default. Assicurati solo di non disattivarla per errore.

Errori comuni che lasciano i moduli vulnerabili

Disattivare la protezione CSRF per comodità. Alcuni sviluppatori spengono i controlli CSRF per testare più facilmente l'API o per semplificare il codice. Non farlo. Crea una vulnerabilità reale.

Usare un token statico per tutti gli utenti. Il token deve essere unico per la sessione di ogni utente. Un token uguale per tutti (o uguale per tutti gli utenti in tutti i giorni) non protegge dal CSRF.

Non rigenerare i token. Se usi lo stesso token per settimane, chi attacca ha più tempo per sfruttarlo. Rigenera i token con regolarità e sempre dopo le operazioni sensibili.

Affidarsi solo ai cookie SameSite. SameSite aiuta ma non basta. Usa i token CSRF come difesa principale e SameSite come riserva.

Dimenticare i token su alcuni moduli. Se proteggi alcuni moduli con i token e altri no, chi attacca userà quelli non protetti. Ogni modulo che modifica dati ha bisogno di protezione.

Che cosa fa WEMASY per la protezione CSRF

I moduli WEMASY includono in automatico la protezione con token CSRF su ogni modulo che crei. Non devi configurarla né pensarci. Quando un visitatore invia un modulo, WEMASY convalida il token prima di salvare l'invio. Questa protezione è integrata e attiva di default.

Scopri di più sulle opzioni di sicurezza dei moduli nella pagina prezzi.

Domande frequenti

Chi attacca può indovinare un token CSRF?
In teoria no. I token CSRF sono casuali dal punto di vista crittografico e cambiano spesso. Chi provasse a indovinarne uno dovrebbe tentare miliardi di possibilità. Nella pratica i token CSRF sono così imprevedibili che indovinarli non è un attacco praticabile. La forza del token sta nella casualità e nell'unicità, non nel tenerlo segreto.
Che cosa succede se un visitatore invia un modulo e il token non è valido?
L'invio del modulo viene respinto. Il tuo server non elabora i dati e non salva l'invio. Di solito il visitatore vede un messaggio di errore (come "Sessione scaduta" o "Richiesta non valida") e gli viene chiesto di riprovare. Dal punto di vista di chi attacca, il modulo nascosto semplicemente non funziona.
Mi serve la protezione CSRF se il mio modulo non richiede l'accesso?
Sì. Gli attacchi CSRF possono funzionare anche sui moduli che non richiedono autenticazione. Chi attacca può usare il CSRF per indurre un visitatore a inviare dati indesiderati a qualsiasi modulo, che il visitatore sia connesso o no. Ogni modulo che elabora invii ha bisogno della protezione CSRF.
In che cosa il CSRF è diverso dall'XSS?
Il Cross-Site Scripting (XSS) è quando chi attacca inserisce codice malevolo nel tuo sito, che poi gira nei browser dei visitatori. Il CSRF è quando induce il browser di un visitatore a inviare un modulo a un altro sito. Sono attacchi diversi con difese diverse. I token CSRF proteggono dal CSRF; la convalida e la pulizia dei dati in ingresso proteggono dall'XSS.
E gli attacchi alle app mobili? I token CSRF funzionano?
Le app mobili sono meno esposte ai classici attacchi CSRF perché non allegano i cookie in automatico come fanno i browser. Le app mobili dovrebbero comunque usare un'autenticazione basata su token o certificati. Se un'app mobile usa cookie o token inviati in automatico con le richieste, dovrebbe convalidare anche i token CSRF come livello di protezione in più.

Mettilo in pratica
sul tuo sito web.

Inizia gratis con WEMASY e crea il tuo sito in pochi minuti.