Back

Un premier aperçu de l'API HTML Sanitizer

Un premier aperçu de l'API HTML Sanitizer

Si vous avez déjà utilisé innerHTML pour afficher du contenu généré par les utilisateurs, vous avez accepté un certain niveau de risque XSS. La solution habituelle consiste à intégrer une bibliothèque comme DOMPurify pour nettoyer la chaîne au préalable. Cela fonctionne, mais cela implique de charger du JavaScript supplémentaire et de faire confiance à un tiers pour rester à jour avec l’évolution du comportement du parseur du navigateur. L’API HTML Sanitizer est la réponse du navigateur à ce problème—et il vaut la peine de la comprendre dès maintenant, même si elle n’est pas encore prête pour une utilisation en production partout.

Points clés à retenir

  • innerHTML analyse et injecte du balisage sans aucune vérification de sécurité, ce qui en fait un vecteur XSS persistant lors de la manipulation de contenu généré par les utilisateurs.
  • L’API HTML Sanitizer introduit des méthodes sécurisées comme Element.setHTML() qui suppriment automatiquement les scripts, les gestionnaires d’événements et les URL dangereuses avant d’insérer le contenu dans le DOM.
  • Vous pouvez configurer le Sanitizer avec des listes d’autorisation ou de suppression pour contrôler exactement quels éléments et attributs survivent à la désinfection.
  • La prise en charge par les navigateurs est encore limitée début 2026, donc le code de production devrait utiliser la détection de fonctionnalités et se rabattre sur DOMPurify.

Pourquoi innerHTML a toujours été un risque

innerHTML fait exactement ce que vous lui demandez : il analyse une chaîne et injecte le résultat dans le DOM, sans poser de questions. C’est pratique jusqu’à ce que quelqu’un transmette <img src=x onerror="stealCookies()"> comme commentaire ou nom d’utilisateur.

Des bibliothèques comme DOMPurify résolvent ce problème en analysant elles-mêmes la chaîne, en parcourant l’arbre DOM résultant et en supprimant tout ce qui est dangereux avant de vous le retourner. C’est efficace, mais fragile. Le comportement d’analyse du navigateur évolue avec le temps, et une bibliothèque qui vit dans l’espace utilisateur doit constamment suivre ces changements. Le navigateur lui-même, en revanche, sait toujours exactement comment il analysera et exécutera un morceau de balisage donné.

Ce que fournit l’API HTML Sanitizer

L’API HTML Sanitizer native déplace la désinfection dans le navigateur. Au lieu de définir innerHTML directement, vous utilisez de nouvelles méthodes qui analysent, désinfectent et injectent en une seule étape.

Les méthodes sécurisées sont celles que vous utiliserez le plus souvent :

  • Element.setHTML()
  • ShadowRoot.setHTML()
  • Document.parseHTML()

Celles-ci suppriment toujours le contenu non sécurisé contre les XSS—balises <script>, attributs de gestionnaires d’événements comme onclick, URL javascript: dans les attributs de navigation—quelle que soit la configuration que vous transmettez. Sans aucune configuration, setHTML() est essentiellement un remplacement direct de innerHTML avec une protection XSS automatique :

const userContent = `<p>Hello!</p><script>alert('xss')<\/script>`;
document.getElementById("output").setHTML(userContent);
// Affiche : <p>Hello!</p>
// Le <script> est silencieusement supprimé

Les méthodes non sécuriséessetHTMLUnsafe(), ShadowRoot.setHTMLUnsafe() et Document.parseHTMLUnsafe()—vous donnent plus de contrôle. Elles appliquent uniquement la configuration de désinfection que vous fournissez, sans imposer la base de sécurité XSS. Utilisez-les uniquement lorsque vous avez une raison spécifique d’autoriser des éléments ou des attributs que les méthodes sécurisées bloqueraient, et uniquement avec une configuration soigneusement construite.

Configuration du Sanitizer

Les deux familles de méthodes acceptent une instance Sanitizer optionnelle ou un dictionnaire de configuration. Vous pouvez créer une configuration d’autorisation (spécifier exactement ce qui est autorisé, supprimer tout le reste) ou une configuration de suppression (spécifier ce qu’il faut supprimer, autoriser tout le reste).

Une configuration d’autorisation est généralement le choix le plus sûr :

const sanitizer = new Sanitizer({
  elements: ["p", "b", "em", "a"],
  attributes: ["href"]
});

document.getElementById("comments").setHTML(untrustedInput, { sanitizer });

La classe Sanitizer expose également des méthodes comme allowElement() et removeElement() pour modifier les configurations de manière programmatique tout en les maintenant cohérentes en interne.

Prise en charge par les navigateurs et que faire à ce sujet

Voici la situation honnête : début 2026, l’API HTML Sanitizer vient tout juste de commencer à être déployée dans les navigateurs. Firefox 148 a ajouté la prise en charge, et Chrome 146 a suivi, mais une disponibilité large entre navigateurs est encore en cours. Elle ne fait pas encore partie de la plateforme web Baseline, ce qui signifie que vous ne pouvez pas compter sur sa disponibilité pour tous vos utilisateurs aujourd’hui. Vous pouvez suivre la prise en charge actuelle sur Can I Use.

Pour le code de production, utilisez la détection de fonctionnalités et revenez à DOMPurify :

if (typeof Element.prototype.setHTML === "function") {
  element.setHTML(untrustedHTML);
} else {
  element.innerHTML = DOMPurify.sanitize(untrustedHTML);
}

Conclusion

L’API HTML Sanitizer représente exactement le type de chose que les standards des navigateurs devraient faire : prendre un modèle dangereux et largement mal géré et rendre le chemin sûr le plus facile. setHTML() versus innerHTML n’est pas vraiment un débat pour l’instant—la prise en charge par les navigateurs prend cette décision pour vous. Mais comprendre l’API maintenant signifie que vous serez prêt à l’adopter à mesure que la prise en charge s’élargira, et vous aurez une image plus claire de ce que la désinfection HTML native du navigateur est réellement conçue pour faire.

FAQ

Pas de manière fiable. Début 2026, Firefox et Chrome ont déployé la prise en charge, mais l'API reste une fonctionnalité à disponibilité limitée et ne fait pas partie de la plateforme web Baseline. Pour les applications de production, utilisez la détection de fonctionnalités pour vérifier Element.prototype.setHTML et revenez à une bibliothèque comme DOMPurify lorsque l'API n'est pas disponible. Cela vous donne une désinfection native là où elle est prise en charge tout en maintenant la sécurité partout ailleurs.

setHTML applique toujours une politique de base sécurisée contre les XSS. Elle supprime les balises script, les attributs de gestionnaires d'événements et les URL dangereuses quelle que soit votre configuration. setHTMLUnsafe applique uniquement la configuration de désinfection que vous fournissez sans ce filet de sécurité. Utilisez setHTMLUnsafe uniquement lorsque vous devez explicitement autoriser des éléments ou des attributs que la méthode sécurisée bloquerait.

Pas encore. DOMPurify reste nécessaire comme solution de repli pour les navigateurs qui ne prennent pas en charge l'API Sanitizer. Même une fois la couverture des navigateurs universelle, DOMPurify offre des options de configuration plus granulaires dont certains projets peuvent avoir besoin. Avec le temps, cependant, l'API native devrait gérer la majorité des cas d'utilisation de désinfection sans nécessiter de dépendance tierce.

Une configuration d'autorisation spécifie exactement quels éléments et attributs sont autorisés et supprime tout le reste. Une configuration de suppression spécifie ce qu'il faut supprimer et autorise tout ce qui n'est pas explicitement listé. Les configurations d'autorisation sont généralement plus sûres car elles bloquent par défaut les éléments inconnus ou nouveaux plutôt que de les autoriser accidentellement.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay