Il link dice:
The client MUST implement CSRF protection [...] typically accomplished by requiring any request sent to the redirection URI endpoint to include a value that binds the request to the user-agent's authenticated state (e.g. a hash of the session cookie [...]
Tuttavia, non dice molto sull'implementazione. Mette solo un po 'di luce su come funziona il CSRF:
A CSRF attack against the client's redirection URI allows an attacker to inject their own authorization code or access token, which can result in the client using an access token associated with the attacker's protected resources rather than the victim's (e.g. save the victim's bank account information to a protected resource controlled by the attacker)
Ma l'uso della parola "piuttosto" rende piuttosto la dichiarazione senza valore.
Sto pensando a come implementare lo "stato" in GAE (usando Webapp2). Sarebbe più semplice partire da come un hacker potrebbe usare un CSRF contro OAuth2. Ho trovato solo un buon articolo sull'argomento: "Falsificazione richiesta cross-site e OAuth2" .
Sfortunatamente, mentre questo post sul blog è ben scritto, non ci sono molte informazioni oltre a spiegare OAuth2. Gli esempi non funzionano, e non conosco Spring. Tuttavia, ho trovato una raccomandazione interessante lì: il server che si connette a un provider OAuth2 deve memorizzare "stato" come una chiave di sessione casuale (ad esempio "this_is_the_random_state": "this_doesn't_matter") e non un valore sotto una chiave statica (ad es. "stato": "random_state_string").
La mia domanda è, qual è la sana attuazione dello "stato"?
- Lo stato generato casualmente deve essere sottoposto a hash o lo stesso valore può essere memorizzato e inviato al provider OAuth2?
- C'è una differenza qui se il back-end di sessione è un cookie sicuro o una tecnologia di storage lato server (ad esempio in GAE Memcache o nel database)?
- Lo stato dovrebbe essere memorizzato come una chiave come suggerito?
- Lo stato dovrebbe avere un periodo di validità, oppure la sessione (se ce n'è una) è abbastanza lunga?