Middleware & Sécurité

Nonce CSP

Le nonce est un jeton aléatoire généré par requête, injecté dans le header CSP et disponible dans les templates Tera. Il permet d'autoriser uniquement les scripts et styles inline explicitement balisés, bloquant tout code injecté par un attaquant.

Fonctionnement

  1. À chaque requête, CspNonce::generate() produit un jeton aléatoire
  2. Le jeton est injecté dans les extensions de la requête
  3. Le header CSP est construit avec 'nonce-{valeur}' dans script-src et style-src
  4. La variable csp_nonce est disponible dans tous les templates Tera
  5. 'unsafe-inline' est automatiquement retiré de script-src et style-src quand le nonce est actif
Content-Security-Policy: script-src 'self' 'nonce-r4nd0m...'; style-src 'self' 'nonce-r4nd0m...'

Usage dans les templates

Tag Runique (recommandé)

<script {% csp %}>
    console.log("Script sécurisé par nonce");
</script>

<style {% csp %}>
    body { margin: 0; }
</style>

Le tag {% csp %} génère nonce="r4nd0m..." directement.

Variable directe

<script nonce="{{ csp_nonce }}">
    console.log("Alternative");
</script>

Transmission à du JavaScript

<script {% csp %}>
    // Stocker le nonce pour les scripts dynamiques si nécessaire
    window.__nonce = "{{ csp_nonce }}";
</script>

Scripts externes

Les scripts chargés depuis une URL autorisée dans script-src n'ont pas besoin de nonce :

<!-- Autorisé si 'self' ou le domaine est dans script-src -->
<script src="/static/js/app.js"></script>

<!-- Nécessite d'ajouter https://cdn.example.com via .scripts(...) dans le builder -->
<script src="https://cdn.example.com/lib.js"></script>

Désactiver le nonce

Non recommandé. Si votre application ne peut pas utiliser de nonce (ex. templates générés côté client) :

.middleware(|m| {
    m.with_csp(|c| c.with_nonce(false))
})

Sans nonce, les scripts inline sont bloqués sauf si 'unsafe-inline' est ajouté à script-src — ce qui neutralise la protection CSP contre le XSS.


Faux positifs dans les outils de développement

Firefox DevTools — sandbox eval code

Avec une CSP stricte (nonce actif), Firefox peut afficher une erreur de ce type dans la console :

Content-Security-Policy : Les paramètres de la page ont empêché l'exécution
d'un script intégré (script-src-elem) [...] sandbox eval code:17

Ce n'est pas un bug dans votre application. Il s'agit du sandbox interne de Firefox (DevTools, inspecteur, console) qui tente d'exécuter du code eval() pour son propre compte et se heurte à la CSP.

  • L'erreur disparaît en fermant les DevTools
  • Chrome ne génère pas ce faux positif
  • Votre application et vos scripts fonctionnent correctement