Une personne saisit des informations sur un ordinateur portable, illustrant un moment de productivité

innerHTML en JavaScript : risques, avantages et alternatives

Publié le

Quand on souhaite modifier le contenu d'une page HTML en utlisant JavaScript, il existe plusieurs façons de faire.
Parmi les nombreuses méthodes disponibles, innerHTML peut sembler être un bon choix qui fonctionne dans de nombreux cas d'usages. Cependant, cette méthode cache des pièges potentiels, notamment en matière de sécurité et de performance.

Dans cet article, nous allons explorer les avantages, les limitations et les bonnes pratiques autour de innerHTML. Vous découvrirez également des alternatives plus sûres et performantes à utiliser.

Qu'est-ce que innerHTML ?

La propriété innerHTML vous permet de lire ou de modifier le contenu HTML d'un élément DOM. Voici un exemple :

document.getElementById('example').innerHTML = '<p>Nouveau contenu</p>';

Cette méthode est particulièrement utile pour insérer rapidement des éléments HTML dynamiques, mais elle écrase le contenu existant de l'élément.

Pourquoi être prudent avec innerHTML ?

Bien que pratique, l'utilisation de innerHTML présente plusieurs inconvénients :

  • Sécurité : Insérer du contenu non vérifié peut ouvrir la porte à des attaques XSS.
  • Performance : La réécriture complète de l'arbre DOM peut être coûteuse, surtout pour des éléments volumineux ou fréquemment modifiés.
  • Lisibilité : Injecter du contenu HTML directement peut rendre le code difficile à maintenir.

Alternatives et Bonnes Pratiques

Pour éviter ces problèmes, il existe plusieurs alternatives à innerHTML :

  • textContent : Pour insérer uniquement du texte sans risquer d'exécuter du code HTML malveillant.
  • insertAdjacentHTML() : Pour ajouter des éléments HTML à des positions spécifiques sans effacer le contenu existant.
  • appendChild() et createElement() : Pour construire et insérer des nœuds de manière dynamique et sécurisée.

Voici un exemple d'utilisation de insertAdjacentHTML :

element.insertAdjacentHTML('beforeend', '<div>Nouveau contenu</div>');

Comparaison des méthodes de manipulation du DOM

innerHTML

Sécurité : ❌ (Vulnérable aux attaques XSS)

Performance : ❌ (Réécriture complète du DOM)

Cas d'usage : Insertion rapide mais risquée de contenu HTML dynamique.

textContent

Sécurité : ✅ (Sécurisé, pas d'interprétation HTML)

Performance : ✅ (Efficace pour des textes)

Cas d'usage : Insertion de texte uniquement.

insertAdjacentHTML

Sécurité : ❌ (Vulnérable aux XSS)

Performance : ✅ (Meilleure gestion du DOM)

Cas d'usage : Ajouter des éléments HTML sans remplacer le contenu existant.

appendChild

Sécurité : ✅ (Création de nœuds sécurisée)

Performance : ✅ (Efficace pour des éléments dynamiques)

Cas d'usage : Construction et insertion dynamique d'éléments.

Impact sur la Performance

Manipuler directement le DOM avec innerHTML peut entraîner des recalculs importants de l'interface, surtout si les modifications sont fréquentes. En utilisant des méthodes plus spécifiques, comme insertAdjacentHTML, vous réduisez le coût de ces opérations.

Sécurité : Attention au XSS

L'un des plus grands risques associés à innerHTML est le Cross-Site Scripting (XSS). Ce type d'attaque se produit lorsque des scripts malveillants sont injectés dans votre page via des données non sécurisées.

Exemple de code vulnérable :

element.innerHTML = userInput;

Pour vous protéger, validez ou échappez toujours les entrées utilisateur.

Sources

Une femme utilise son ordinateur portable, les doigts sur le clavier Changer la couleur d'une icône au clic avec HTML et CSS

Apprenez à changer la couleur d'une icône SVG au clic uniquement avec HTML et CSS, sans utiliser JavaScript.

Les mains d'une femme tapant sur le clavier d'un ordinateur portable Simplifiez vos modales avec l’élément dialog

Découvrez comment simplifier la création de modales accessibles et personnalisées grâce à l'élément HTML dialog.

Un clavier d'ordinateur où le focus est placé sur les flèches Déplacer un élément avec les flèches du clavier en JavaScript

Apprenez à déplacer un élément sur une page web à l'aide des touches directionnelles du clavier en combinant HTML, CSS et JavaScript.