/ / Genera un nuovo token CSRF senza ricaricare l'intero modulo - symfony

Genera un nuovo token CSRF senza ricaricare l'intero modulo - symfony

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 № 1

Supponendo 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.