Cross Site Request Forgery (CSRF) è in genere prevenire con uno dei seguenti metodi:Come prevenire CSRF in un'applicazione RESTful?
- check referer - RESTful ma inaffidabile gettone
- inserto in forma e memorizzare il token nella sessione di server - non proprio RESTful
- criptici URI una sola volta - non RESTful per la stessa ragione come token
- inviare password manualmente per questa richiesta (non la password memorizzata nella cache utilizzata con autenticazione HTTP) - RESTful ma non conveniente
La mia idea è quella di utilizzare un utente segreto, un form enigmatico ma statico e JavaScript per generare token.
<form method="POST" action="/someresource" id="7099879082361234103">
<input type="hidden" name="token" value="generateToken(...)">
...
</form>
GET /usersecret/john_doe
inverosimile dal JavaScript dal utente autenticato.- Risposta:
OK 89070135420357234586534346
Questo segreto è concepzionalmente statico, ma può essere modificato ogni giorno/ora ... per migliorare la sicurezza. Questa è l'unica cosa confidenziale. - Leggere l'ID modulo criptico (ma statico per tutti gli utenti!) Con JavaScript, elaborarlo insieme al segreto utente:
generateToken(7099879082361234103, 89070135420357234586534346)
- Inviare il modulo insieme al token generato sul server.
- Poiché il server conosce il segreto dell'utente e l'id del modulo, è possibile eseguire la stessa funzione generateToken eseguita dal client prima dell'invio e confrontare entrambi i risultati. Solo quando entrambi i valori sono uguali l'azione sarà autorizzata.
C'è qualcosa di sbagliato in questo approccio, nonostante il fatto che non funzioni senza JavaScript?
addendum:
Il tuo usersecret non è univoco per l'utente, un utente malintenzionato deve semplicemente ottenere quel numero e modificare i propri script per utilizzare il nuovo calcolo. Come stai autenticando gli utenti se non hai nessuno stato? – Mike
Il segreto utente è univoco per utente e può essere recuperato solo dopo l'autenticazione (autenticazione di base o digest o autenticazione del certificato HTTP) – deamon