Se un utente viene disconnesso (a causa della sessionescadenza o per altri motivi) in background durante l'utilizzo dell'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 si trova nel mezzoriempiendo 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.
risposte:
33 per risposta № 1Supponendo che si usi il provider CSRF predefinito, nel proprio controller AJAX è possibile ottenere il servizio Provider CSRF e "chiederlo" per rigenerare token:
Symfony 2.3 (e precedente)
/** @var SymfonyComponentFormExtensionCsrfCsrfProviderSessionCsrfProvider $csrf */
$csrf = $this->get("form.csrf_provider");
$token = $csrf->generateCsrfToken($intention);
return new Response($token);
Symfony 2.4
/** @var SymfonyComponentSecurityCsrfCsrfTokenManagerInterface $csrf */
$csrf = $this->get("security.csrf.token_manager");
$token = $csrf->refreshToken($intention);
return new Response($token);
10 per risposta № 2
Usalo per rigenerare il token CSRF (da Symfony2.4):
$csrf = $this->get("security.csrf.token_manager"); //SymfonyComponentSecurityCsrfCsrfTokenManagerInterface
$token = $csrf->refreshToken($intention); // Intention is specified in form type
return new Response($token);
4 per risposta № 3
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 sono pensati per impedire l'invio di moduli da parte dei bot.
1 per risposta № 4
Per me la soluzione più semplice è reindirizzare l'utente sullo stesso modulo, passando i dati già inseriti tramite POST.
In questo modo il token verrà generato di nuovo in modo automatico.
Inoltre, non perderai l'input dei dati.