La principale differenza tra XSS e CSRF è la prospettiva:
- XSS: sfrutta la fiducia che l'utente ha in un determinato sito web
- CSRF: sfrutta la fiducia che il sito Web ha per il browser dell'utente
XSS ha una dipendenza da javascript sì, ma non è limitato a quell'ambito. Quello che voglio dire è che hai bisogno di javascript per il payload, ma i payload sono noti per essere eseguiti non solo da JS stesso, ma anche da activeX, flash, VBScript e html per nominarne alcuni. Tutto dipende da ciò che il sito permetterà agli utenti di cambiare sul sito stesso. Quindi noscript è un ottimo modo per impedire l'esecuzione di script di livello superiore (si pensi a <script>attackmeplease()</script>
) ma a seconda del sito qualcuno può diventare davvero intelligente inserendolo nel supporto flash che l'utente consente di eseguire perché è un sito di condivisione video (un grezzo esempio, ma hai un'idea, l'ingegneria sociale ha un ruolo).
CSRF non ha tale dipendenza da javascript ed è progettato per inviare una richiesta ad altri siti Web senza che gli utenti ne siano a conoscenza. Dipende molto dalla capacità del browser di ottenere ed eseguire il pacchetto di attacco. Un'altra differenza è che può venire in più forme come tag immagine HTML, oggetti immagine javascript, documenti word, film, e-mail, ecc ... La richiesta stessa non può essere bloccata se il pacchetto viene eseguito no, ma il sito può convalidare la richiesta.
Alcune altre differenze sono i requisiti per l'istanziazione, in uno l'utente deve visitare un sito specifico, nell'altro devono usare un materiale contaminato che può provenire da una varietà di fonti, non solo da un sito. Anche l'ultimo punto di errore è diverso, in XSS l'utente è l'ultimo punto di errore, mentre in CSRF il server è.
Un'altra grande differenza è che un sito vulnerabile a XSS è quasi certamente vulnerabile a CSRF, mentre essere protetto da XSS anche completamente non significa che tu sia protetto da CSRF.