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
- À chaque requête,
CspNonce::generate()produit un jeton aléatoire - Le jeton est injecté dans les extensions de la requête
- Le header CSP est construit avec
'nonce-{valeur}'dansscript-srcetstyle-src - La variable
csp_nonceest disponible dans tous les templates Tera 'unsafe-inline'est automatiquement retiré descript-srcetstyle-srcquand 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