Genera un nuovo token CSRF senza ricaricare l’intero modulo

Se un utente viene disconnesso (a causa della scadenza della sessione o per altri motivi) in background mentre utilizza l’applicazione Symfony2, ho implementato un layer JS che appare sullo schermo, consentendo all’utente di accedere immediatamente e continuare a utilizzare il sito web.

Il problema è che se l’utente è nel mezzo del riempimento di un modulo e viene disconnesso, dopo aver effettuato il login usando il layer JS, sta ancora guardando lo stesso modulo con i valori che è già riuscito a digitare, ma la sua sessione cambia. Il token CSRF nel modulo non è quindi valido.

C’è un modo per generare un nuovo token CSRF basato sulla sessione corrente e una forma particolare, prenderlo da AJAX e sostituirlo nel modulo? O forse c’è un’altra soluzione a questo?

Non voglio disabilitare la protezione CSRF.

Supponendo che si utilizzi il provider CSRF predefinito, nel proprio controller AJAX è ansible ottenere il servizio Provider CSRF e “chiederlo” per rigenerare token:

Symfony 2.3 (e precedente)

/** @var \Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider $csrf */ $csrf = $this->get('form.csrf_provider'); $token = $csrf->generateCsrfToken($intention); return new Response($token); 

Symfony 2.4

 /** @var \Symfony\Component\Security\Csrf\CsrfTokenManagerInterface $csrf */ $csrf = $this->get('security.csrf.token_manager'); $token = $csrf->refreshToken($intention); return new Response($token); 

Usalo per rigenerare il token CSRF (da Symfony2.4):

 $csrf = $this->get('security.csrf.token_manager'); //Symfony\Component\Security\Csrf\CsrfTokenManagerInterface $token = $csrf->refreshToken($intention); // Intention is specified in form type return new Response($token); 

Sì, il bot può recuperare un token csrf e pubblicare qualcosa nel modulo, ma poiché il token è associato alla sessione, non importa. I token CSRF non hanno lo scopo di impedire l’invio di moduli da parte di bot.

Per me la soluzione più semplice è quella di redirect l’utente sullo stesso modulo, passando i dati alredy inseriti tramite POST.
In questo modo il token verrà generato di nuovo in modo automatico.
Inoltre, non perderai l’input dei dati.