flawopen.com/XSS en JavaScript/Svelte
Svelte protège-t-il du XSS par défaut ?
Imaginez `{comment}` comme un billet imprimé : les chevrons restent visibles comme du texte. `{@html comment}`, c’est demander au typographe d’interpréter les marques de la page comme des consignes de mise en page. Si elles viennent d’une source non fiable, le navigateur peut les interpréter comme du HTML et provoquer un XSS.
<p>{@html comment}</p>
// la valeur est interprétée comme du balisage HTML
<p>{comment}</p>
// échappé automatiquement
La règle
Svelte compile la sortie ordinaire de {expression} en texte échappé : la valeur n’est donc pas interprétée comme du balisage HTML. À l’inverse, {@html} rend volontairement une chaîne HTML. La documentation de Svelte précise que cette valeur doit être échappée ou maîtrisée pour prévenir le XSS. Traitez cette directive comme un point d’insertion HTML sensible et utilisez un assainisseur maintenu si du texte enrichi fourni par des utilisateurs est nécessaire.
Vérifier votre code
Recherchez `{@html}` dans les fichiers `.svelte`. Pour chaque occurrence, remontez à l’origine de la valeur et examinez toutes ses transformations. Considérez les entrées utilisateur, les données externes et les contenus utilisateur stockés comme non fiables. Si le contenu doit rester du texte, utilisez `{expression}`. Si du HTML enrichi est nécessaire, assainissez-le avec un assainisseur HTML maintenu et vérifiez que les balises interdites sont supprimées.
grep -rn "{@html" --include="*.svelte" .HTML enrichi : préserver la frontière de sanitisation
Utilisez `{expression}` lorsque le contenu doit s’afficher comme du texte. Si les utilisateurs doivent créer du HTML, assainissez le contenu final avec un assainisseur HTML maintenu, comme DOMPurify, avant de le transmettre à `{@html}`. Ne concaténez et ne modifiez pas le résultat assaini ensuite : cela peut annuler la protection. Maintenez l’assainisseur à jour et n’autorisez que les éléments et attributs de balisage nécessaires au produit. L’assainissement HTML ne rend pas cette même valeur sûre dans des contextes JavaScript, CSS ou URL.
Références
- Documentation Svelte — {@html ...}
- flawopen.com — XSS en JavaScript
- DOMPurify — project documentation
- OWASP — Cross Site Scripting Prevention