Encodeur / Décodeur d'entités HTML

Convertissez les caractères spéciaux en entités HTML (&, <, ©) ou décodez les entités en texte lisible — dans les deux sens, en direct.

958 vues

Comment ça marche

HTML réserve une poignée de caractères pour sa propre syntaxe : < et > délimitent les balises, et & démarre une référence d'entité. Si ces caractères apparaissent littéralement dans un contenu inséré dans une page — un commentaire, un nom d'utilisateur, une recherche renvoyée à l'écran — le navigateur tente de les interpréter comme du balisage au lieu de les afficher comme du texte. L'encodage les convertit sous leur forme d'entité (&lt;, &gt;, &amp;) afin qu'ils s'affichent comme des caractères littéraux au lieu d'être interprétés. Le décodage fait l'inverse, transformant des entités comme &amp; ou &#8217; en leurs caractères réels.

Ce n'est pas un détail cosmétique — c'est un contrôle de sécurité. Si un champ de commentaire prend une saisie utilisateur et l'insère dans le HTML de la page sans l'encoder d'abord, un visiteur peut taper <script>...</script> et faire réellement exécuter ce script dans le navigateur de chaque autre visiteur : cette classe de vulnérabilité s'appelle le Cross-Site Scripting (XSS), et encoder toute sortie non fiable avant qu'elle ne touche le HTML est la défense standard contre cela. Par exemple, encoder le texte 5 < 10 & 10 > 5 produit 5 &lt; 10 &amp; 10 &gt; 5, qui s'affiche correctement et ne peut pas être confondu avec du balisage.

Ce qu'il faut savoir

  • Les entités nommées et numériques représentent le même caractère différemment. &apos; (nommée) et &#39; (numérique) signifient toutes deux une apostrophe, mais les entités nommées dépendent de la reconnaissance de ce nom précis par l'analyseur — les entités numériques (décimales ou hexadécimales &#x) sont universellement prises en charge et plus sûres pour une sortie générée par une machine.
  • L'encodage n'est pas la seule défense. Il protège le contenu textuel ; les attributs, les URL et les contextes JavaScript en ligne ont besoin de leurs propres règles d'échappement, puisqu'une valeur dans href="javascript:..." ou dans un bloc <script> est analysée selon des règles différentes du texte de corps ordinaire.
  • La conversion est locale. Cet outil utilise l'analyseur DOM propre à votre navigateur — rien n'est envoyé ni journalisé.
  • Tous les langages de templating côté serveur n'échappent pas automatiquement par défaut. Certains (comme l'ancienne sortie PHP ou la concaténation de chaînes brute) exigent d'appeler explicitement une fonction d'échappement — l'oublier est l'une des sources les plus courantes de failles XSS réelles.
  • Certaines entités se ressemblent visuellement de très près. Une apostrophe droite (') et une apostrophe typographique courbe (&#8217;) s'affichent presque à l'identique à l'écran mais sont des séquences d'octets différentes — une distinction qui compte dans des exemples de code ou des URL.

Un avant/après concret : un champ de commentaire contenant Bel article ! 5 < 10, non ? n'a besoin d'aucun traitement particulier en tant que texte brut, mais dès qu'il est inséré sans échappement dans un modèle HTML, un visiteur malveillant pourrait au contraire soumettre <img src=x onerror=alert(1)> — l'encodage transforme cela en texte inerte et visible au lieu d'un gestionnaire d'erreur d'image qui s'exécute réellement.

Questions fréquentes

Pourquoi encoder le texte avant de l'insérer dans du HTML ?

Un < ou & non échappé dans un contenu HTML peut être interprété comme du balisage, casser la mise en page ou — bien pire — permettre à des balises injectées <script> ou <img onerror> de réellement s'exécuter (Cross-Site Scripting). Encoder en &lt; et &amp; garde le texte littéral et inerte, quoi qu'un utilisateur ait tapé.

Gère-t-il à la fois les entités nommées et numériques ?

Oui — le décodage comprend à la fois les entités nommées (&amp;copy;) et numériques, qu'elles soient décimales (&amp;#169;) ou hexadécimales (&amp;#x00A9;). Les trois représentent le même caractère © ; l'outil les normalise toutes vers le glyphe réel.

Pourquoi utiliser une entité numérique plutôt qu'une nommée, ou l'inverse ?

Les entités nommées (&amp;apos;, &amp;hellip;) sont plus lisibles dans le code source, mais dépendent de la reconnaissance de ce nom exact par l'analyseur — quelques-unes moins courantes ont un support incohérent selon les outils anciens. Les entités numériques (&amp;#39;, &amp;#8230;) sont universellement comprises par tout analyseur HTML, quel que soit son âge ou son éditeur, ce qui explique pourquoi les outils automatisés et les bibliothèques de sanitisation les préfèrent souvent.

L'encodage seul rend-il ma page sûre contre le XSS ?

Il traite les nœuds de texte, mais HTML a d'autres contextes d'injection — à l'intérieur d'une valeur d'attribut, à l'intérieur d'une URL, à l'intérieur d'un bloc <script> ou <style> — chacun nécessite sa propre approche d'échappement, car l'analyseur du navigateur change de règles selon l'endroit du document où il se trouve. Encoder le contenu textuel en entités est une couche essentielle, pas toute la défense ; une étape de « sanitisation » plus large qui supprime ou réécrit des balises entières est un outil séparé et plus normatif, pour quand vous voulez délibérément autoriser un HTML limité.

Mon texte est-il envoyé quelque part ?

Non — la conversion se fait instantanément dans votre navigateur en utilisant l'analyseur propre du DOM ; rien n'est envoyé, journalisé ou stocké, ce qui rend l'outil sûr même pour tester un contenu réellement soumis par un utilisateur, y compris tout ce que vous soupçonnez de contenir une tentative d'injection.

Commentaires

Pas encore de commentaires — soyez le premier à en écrire un !

Outils similaires