-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
Description
Le moteur de template doU.js compile les templates en générant dynamiquement du code JavaScript à l’aide de new Function.
Bien que cela permette de bonnes performances, cette approche introduit des risques de sécurité et des problèmes de maintenabilité, surtout lorsque les templates ne sont pas entièrement fiables.
Problème identifié
Dans la fonction doU.template :
return new Function(conf.varname, str);
Le contenu du template est directement transformé en code JavaScript exécutable.
Toute expression entre {{ }}, {{= }} ou {{! }} est évaluée sans validation.
Si un template provient d’une source externe (ex: utilisateur, base de données), cela peut mener à :
Injection de code JavaScript
Failles XSS côté client
Exécution de code arbitraire côté serveur (Node.js)
Étapes pour reproduire
Fournir un template contenant du JavaScript malveillant :
{{= (function(){ alert('XSS') })() }}
Compiler le template avec doU.template
Exécuter la fonction compilée
Observer que le code est exécuté sans restriction
Comportement attendu
Les templates devraient être traités comme du contenu logique, pas comme du code exécutable brut
Il devrait être impossible d’exécuter du JavaScript arbitraire à partir d’un template non fiable
Comportement actuel
Toute expression JavaScript valide est exécutée
Aucune sandbox, validation ou mode sécurisé n’est proposé
Impact
❗ Risque de sécurité élevé (XSS / RCE)
❗ Incompatible avec des politiques CSP strictes
❗ Difficile à auditer et sécuriser dans des applications modernes
Suggestion de correction
Documenter explicitement que doU.js ne doit pas être utilisé avec des templates non fiables
Ajouter une option de configuration pour :
Désactiver l’évaluation directe ({{ }})
Autoriser uniquement l’interpolation simple
Envisager :
Un mode “safe” sans new Function
Un parsing plus strict des expressions
Une alternative plus moderne et sécurisée
Contexte
Version concernée : 0.1.2
Type : Sécurité / Design
Environnement : Navigateur & Node.js