Credo che tu stia mescolando alcune minacce diverse e attacchi i vettori qui.
Minaccia: MITM sniffing o impostazione di token
Posizione: Wi-Fi pubblico
Come attenuare: utilizzare HTTPS in modo che la connessione sia protetta tramite TLS / SSL. Inoltre, è consigliata la Bandiera sicura dei cookie e una politica HSTS con precarico.
Minaccia: XSS
Posizione: su Internet
Che cos'è: un utente malintenzionato che inserisce il codice JavaScript nella pagina, invitando la vittima a visitare un URL per un attacco "riflesso XSS" o memorizzando uno script nel database del sistema che non è codificato correttamente sull'output per un attacco "memorizzato XSS". Quando viene eseguito il payload di attacco, proviene dal browser e dall'IP della vittima.
Come mitigare: codifica corretta dei valori di output, implementa un criterio di sicurezza del contenuto, imposta X-XSS-Protection
e X-Content-Type-Options
intestazioni HTTP, imposta il flag HttpOnly sui cookie.
Minaccia: CSRF
Posizione: su Internet
Che cos'è: l'autore dell'attacco che attira la vittima a visitare il sito dell'attaccante o un sito compromesso dall'attaccante che inoltra una richiesta dannosa a un sito valido a cui è inoltre collegata la vittima. Quando viene eseguito il payload di attacco, proviene dal browser e dall'IP della vittima.
Come mitigare: genera un token casuale per sessione che viene passato al di fuori del meccanismo del cookie (alias Pattern token di sincronizzazione ).
I tuoi punti
I was wondering what prevents an attacker from generating his/her own
token
Nulla - tuttavia, se il token è stato associato alla sessione utente, l'accesso di Mario non può utilizzare il token CSRF di Alice e viceversa. Pertanto, qualsiasi attaccante non sarà in grado di utilizzare il proprio token in un attacco CSRF. Una buona posizione di archiviazione è il meccanismo di sessione lato server fornito da molti framework Web.
Then I began requiring the clients IP to also be stored and checked
during validation. But this would not be secure if our attacker and
victim were on the same network such as a public WiFi hotspot.
Un attacco CSRF proviene dal browser della vittima. Pertanto, l'indirizzo IP sarà uguale al resto della sessione della vittima. Leggendo il tuo paragrafo di nuovo, ora mi rendo conto che potresti non aver fatto riferimento a una situazione Man-In-The-Middle come ho descritto sopra, tuttavia l'ho lasciato per completezza.
My attempt at a solution: To place a cookie on every user's browser
and to hash their token with the cookie's value so that I can be sure
that it is not an XSS attack.
XSS è un tipo diverso di attacco. Se si dispone di una vulnerabilità XSS, la maggior parte dei meccanismi di protezione CSRF è inutile o gravemente compromessa.
Il meccanismo che descrivi sembra essere il Pattern token crittografato che è anche un modo valido per mitigare CSRF.