Logo

CSRF

Protection CSRF — Prisme, contrat POST vers handler.

Contrat POST — Prisme extractor handler
// Tout formulaire POST doit passer par Prisme<T>
// Prisme valide le token CSRF avant d''entrer dans le handler.
pub async fn inscription(
    mut request: Request,
    Prisme(mut form): Prisme<RegisterForm>,
) -> AppResult<Response> {
    if request.is_post() && form.is_valid().await {
        // Traitement securise — le CSRF a ete valide
        return Ok(Redirect::to("/profil").into_response());
    }
    context_update!(request => { "form" => &form });
    request.render("auth/inscription.html")
}
Contrat POST — Prisme extractor handler
// Tout formulaire POST doit passer par Prisme<T>
// Prisme valide le token CSRF avant d''entrer dans le handler.
pub async fn inscription(
    mut request: Request,
    Prisme(mut form): Prisme<RegisterForm>,
) -> AppResult<Response> {
    if request.is_post() && form.is_valid().await {
        // Traitement securise — le CSRF a ete valide
        return Ok(Redirect::to("/profil").into_response());
    }
    context_update!(request => { "form" => &form });
    request.render("auth/inscription.html")
}
Token CSRF dans le template template
<form method="POST" action="{% link "inscription" %}">
    {# Rendu complet — CSRF inclus automatiquement #}
    {% form.inscription_form %}
    <button type="submit">S''inscrire</button>
</form>

{# Rendu champ par champ — CSRF toujours inclus automatiquement #}
<form method="POST" action="{% link "inscription" %}">
    {% form.inscription_form.username %}
    {% form.inscription_form.password %}
    <button type="submit">S''inscrire</button>
</form>
Token CSRF dans le template template
<form method="POST" action="{% link "inscription" %}">
    {# Rendu complet — CSRF inclus automatiquement #}
    {% form.inscription_form %}
    <button type="submit">S''inscrire</button>
</form>

{# Rendu champ par champ — CSRF toujours inclus automatiquement #}
<form method="POST" action="{% link "inscription" %}">
    {% form.inscription_form.username %}
    {% form.inscription_form.password %}
    <button type="submit">S''inscrire</button>
</form>
Fonctionnement interne
// GET  → token genere, stocke en session, injecte dans le contexte Tera
// POST → Prisme extrait le token du body, compare en constant-time
//        (via subtle::ConstantTimeEq pour eviter les timing attacks)

// Si le token est invalide ou absent :
//   → formulaire vide + message d''erreur CSRF
//   → le handler n''est jamais execute

// Le token est lie a la session — il change a chaque nouvelle session.
Fonctionnement interne
// GET  → token genere, stocke en session, injecte dans le contexte Tera
// POST → Prisme extrait le token du body, compare en constant-time
//        (via subtle::ConstantTimeEq pour eviter les timing attacks)

// Si le token est invalide ou absent :
//   → formulaire vide + message d''erreur CSRF
//   → le handler n''est jamais execute

// Le token est lie a la session — il change a chaque nouvelle session.