This commit is contained in:
julien
2026-03-27 22:40:44 +01:00
parent 7757628a94
commit 38eea09710
3 changed files with 60 additions and 37 deletions

View File

@@ -20,9 +20,10 @@ abstract class BaseController
{
$user = $this->currentUser();
// Les pages publiques émettent un Cache-Control avec le TTL demandé.
// Un utilisateur connecté voit un état de session (nav, CSRF) :
// on force expire(0) pour ne pas servir ce rendu à d'autres visiteurs.
// Les pages publiques peuvent rester cacheables avec le TTL demandé.
// Si un utilisateur est connecté, le layout dépend de la session
// (navigation d'admin, déconnexion + CSRF) : on force expire(0)
// pour ne pas servir ce rendu à d'autres visiteurs.
$this->f3->expire($user !== null ? 0 : $cacheTtl);
$flash = array_key_exists('flash', $data) && is_array($data['flash'])
@@ -36,9 +37,9 @@ abstract class BaseController
'metaDescription' => null,
]);
// Persister le jeton CSRF courant en session : le formulaire
// affiche @CSRF (jeton de cette requête) ; à la soumission,
// verifyCsrf() le comparera à SESSION.csrf.
// Mémoriser en session la valeur exposée à @CSRF pour que les
// formulaires rendus pendant cette réponse puissent être vérifiés
// lors du POST suivant par verifyCsrf().
$this->f3->copy('CSRF', 'SESSION.csrf');
echo Template::instance()->render('layout.html');
}
@@ -64,10 +65,10 @@ abstract class BaseController
$this->f3->reroute('@login');
}
// Le jeton CSRF est fourni par la classe Session de F3
// (clé de ruche « CSRF », copiée en SESSION.csrf à chaque requête).
// Le formulaire envoie le jeton affiché lors du GET précédent,
// qu'on compare au jeton sauvegardé en session.
// La classe Session de F3 expose la valeur courante via « CSRF ».
// Au rendu, on la recopie en SESSION.csrf ; le formulaire renvoie
// ensuite le jeton affiché lors du rendu précédent, qu'on compare à
// la valeur mémorisée en session.
protected function verifyCsrf(): void
{
$submitted = (string) ($this->f3->get('POST.csrf_token') ?? '');