Nota rapida: questo non è un duplicato di Protezione CSRF con intestazioni personalizzate (e senza token di convalida) nonostante alcune sovrapposizioni. Quel post discute come eseguire la protezione CSRF sugli endpoint Rest senza discutere se è effettivamente necessario. Infatti, molte domande su CSRF / Riposo che ho letto su questo sito parlano di proteggere gli endpoint tramite i token CSRF senza effettivamente discutere se sia necessario o meno. Quindi questa domanda.
La protezione CSRF è necessaria per gli endpoint dell'API resto
Ho visto molte discussioni sulla sicurezza degli endpoint REST contro gli attacchi CSRF, ma avendo riflettuto molto sull'argomento, sono assolutamente certo che i token CSRF su un endpoint REST garantiscano zero protezione aggiuntiva. Pertanto, abilitare la protezione CSRF su un endpoint REST introduce solo un codice inutile per l'applicazione e penso che dovrebbe essere saltato. Però mi mancherà qualcosa, quindi questa domanda. Penso che aiuterà a tenere a mente perché la protezione CSRF è necessaria in primo luogo e i vettori di attacco che protegge da:
Perché CSRF?
Si riduce in realtà alla capacità del browser di presentare automaticamente le credenziali di accesso per qualsiasi richiesta inviando cookie. Se un ID di sessione è memorizzato in un cookie, il browser lo invierà automaticamente insieme a tutte le richieste che tornano al sito Web originale. Ciò significa che un utente malintenzionato in realtà non deve conoscere i dettagli di autenticazione per eseguire un'azione come utente vittima. Piuttosto, l'attaccante deve solo ingannare il browser delle vittime per fare una richiesta, e le credenziali per autenticare la richiesta andranno gratis.
Inserisci un'API REST
Gli endpoint dell'API di resto hanno una differenza molto importante rispetto ad altre richieste: sono specificatamente privi di stato e non dovrebbero mai accettare / utilizzare dati da un cookie o da una sessione. Di conseguenza, un'API REST che si attacca allo standard è automaticamente immune da tale attacco. Anche se un cookie è stato inviato dal browser, qualsiasi credenziale associata al cookie sarebbe completamente ignorata. L'autenticazione delle chiamate a un'API REST avviene in modo completamente diverso. La soluzione più comune consiste nell'avere una sorta di chiave di autenticazione (un token OAuth o simile) che viene inviata nell'intestazione da qualche parte o possibilmente nel corpo della richiesta stessa.
Poiché l'autenticazione è specifica dell'applicazione, e poiché il browser stesso non sa quale sia il token di autenticazione, non vi è alcun modo per un browser di fornire automaticamente le credenziali di autenticazione anche se è in qualche modo indotto a visitare l'endpoint dell'API. Di conseguenza, un endpoint REST senza cookie è completamente immune dagli attacchi CSRF.
O mi manca qualcosa?