Questa è una domanda sulla generazione di token CSRF.Generazione di token CSRF
Generalmente mi piacerebbe generare un token basato su un pezzo unico di dati associato alla sessione dell'utente, e con hash e salato con una chiave segreta.
La mia domanda riguarda la generazione di token quando NON ci sono dati utente unici da utilizzare. Nessuna sessione è disponibile, i cookie non sono un'opzione, l'indirizzo IP e cose di questa natura non sono affidabili.
C'è qualche motivo per cui non posso includere anche la stringa in hash come parte della richiesta? Esempio pseudocodice per generare il token e incorporarlo:
var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}">click me</a>
Esempio validazione lato server del CSRF gettone
var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')
La stringa in uso nel hash sarebbe diverso su ogni richiesta. Finché è stato incluso in ogni richiesta, è possibile procedere con la convalida del token CSRF. Poiché è nuovo su ogni richiesta e solo incorporato nella pagina, l'accesso esterno al token non sarebbe disponibile. La sicurezza del token cade quindi su $ mySecretKey essendo nota solo a me.
È un approccio ingenuo? Mi manca qualche motivo per cui questo non può funzionare?
Grazie
La soluzione proposta è vulnerabile agli attacchi di riprodurre.Lo stesso token e combinazione di tasti funzioneranno indefinitamente. – Matthew