In primo luogo, dobbiamo capire il problema principale di CSRF; il server si fida di ogni richiesta che inviamo, in altre parole, il server non garantisce che la richiesta sia stata inviata consapevolmente da un utente legittimo, per questo motivo, dobbiamo aggiungere un elemento per identificare correttamente ogni richiesta.
L'idea principale per proteggere againts CSRF è l'implementazione di un elemento unico e questo deve essere difficile da prevedere, quindi le misure come token o CAPTCHA sono buone soluzioni. Il CAPTCHA non è efficiente nella maggior parte dei casi, perché a un utente non piace introdurre valori sul CAPTCHA per ogni sito che visita, ricorda, ci deve essere un equilibrio tra sicurezza e prestazioni, in questo modo, la soluzione principale sarà essere token.
Ora, controllare l'origine non è sufficiente per proteggere contro CSRF; immagina un sito Web vulnerabile all'XSS, puoi iniettare uno script per eseguire un attacco CSRF; un altro esempio potrebbe essere un modulo modificabile in cui è possibile aggiungere o modificare elementi per personalizzare una pagina Web che potrebbe essere visitata per ogni utente dell'applicazione, è possibile aggiungere qualcosa come:
<img src="http://mywebsite/transfer?account=123456&quantity=1000000" />
Se l'applicazione web convalida l'origine, in questo caso la richiesta sarà valida, perché appartiene alla stessa origine.
Spero che questa informazione ti aiuti.