Échappez et déséchappez les entités HTML. Convertissez < > & " ' en entités nommées, encodez éventuellement tous les caractères non ASCII, et décodez les références nommées ou numériques en texte.
Échappez le texte pour qu'il soit sûr dans le HTML, ou reconvertissez les entités en caractères. Saisissez dans l'une des deux zones pour convertir dans ce sens. Le mode minimal n'échappe que les cinq caractères essentiels à la correction ; le mode étendu encode aussi chaque caractère non ASCII pour une compatibilité maximale.
Un analyseur HTML lit < comme le début d'une balise et & comme le début d'une référence d'entité. Si votre contenu contient l'un d'eux, l'analyseur cesse de le traiter comme du texte. L'échappement remplace le caractère par une référence que l'analyseur résout à nouveau vers le glyphe d'origine sans jamais lui donner de signification structurelle.
Seuls cinq caractères nécessitent vraiment un échappement en HTML :
& devient & — doit être en premier, sinon vous doublerez l'échappement de tout le reste
< devient <
> devient >
\" devient " — requis à l'intérieur des valeurs d'attribut entre guillemets
' devient ' — requis à l'intérieur des valeurs d'attribut entre apostrophes
Dans le texte d'un élément, vous n'avez strictement besoin que de & et <. Les trois autres importent dès que votre texte peut atterrir dans un attribut, et comme vous contrôlez rarement cela au moment de l'échappement, échapper les cinq est la bonne habitude.
Références nommées, décimales et hexadécimales
Un même caractère peut s'écrire de trois façons. Une espace insécable est ,   ou  . Les références nommées sont les plus lisibles mais la liste HTML5 en compte environ 2 200 et les analyseurs plus anciens en connaissent beaucoup moins, donc les noms obscurs sont un risque de portabilité. Les références numériques fonctionnent pour n'importe quel point de code Unicode et sont toujours sûres. Chaque référence nommée en HTML5 exige le point-virgule final ; une poignée de noms hérités comme & se parse toujours sans lui pour compatibilité ascendante, mais s'y fier est un bug en attente.
L'échappement n'est pas une sanitisation
L'échappement est ce qui arrête le cross-site scripting : si une entrée utilisateur contenant <script> est échappée en <script>, le navigateur affiche le texte littéral et n'exécute rien. Mais l'échappement ne fonctionne que s'il a lieu dans le bon contexte. L'échappement HTML ne suffit pas à l'intérieur d'un bloc <script>, d'un attribut style, ou dans une URL — chacun a besoin de son propre encodage. Et l'échappement doit être appliqué une fois, au moment de la sortie. Échapper à l'entrée puis à la sortie produit &lt; et du texte visible inutilisable.
Quand vous avez besoin du mode étendu
Échapper les caractères non ASCII n'est imposé par aucune spécification moderne. Un document UTF-8 peut contenir é et 中 directement, et c'est généralement le meilleur choix : c'est plus court, plus lisible et plus facile à rechercher. Le mode étendu existe pour les cas où le flux d'octets doit survivre à un canal qui corrompt le non ASCII — certains modèles d'e-mail hérités, anciens champs CMS, pipelines XML avec un encodage déclaré flou, ou une étape de build bloquée en Latin-1. Si vous contrôlez l'encodage de bout en bout, restez en mode minimal.
Le piège de l'espace insécable
est U+00A0, un caractère différent de l'espace ordinaire U+0020. Il empêche un saut de ligne et évite que les navigateurs ne fusionnent les suites d'espaces, c'est pourquoi les éditeurs WYSIWYG l'émettent abondamment. Comme il est identique visuellement, il casse silencieusement les comparaisons de chaînes, les expressions régulières écrites avec \\s dans certains moteurs, et les import CSV. Si une valeur semble correcte mais refuse de correspondre, vérifiez la présence d'une espace insécable errante.
FAQ
Dois-je échapper le signe supérieur ?
Strictement non — un > seul dans un texte est non ambigu et se parse bien. Il est échappé par convention car cela ne coûte rien et évite la confusion dans le balisage généré, particulièrement quand la sortie est ensuite traitée par des outils plus stricts qu'un navigateur.
Pourquoi & doit-il être échappé en premier ?
Car chaque autre séquence d'échappement commence par une esperluette. Si vous remplaciez < par < avant d'échapper &, le passage suivant transformerait cette esperluette en & et vous finiriez avec &lt; sur la page.
L'échappement suffit-il à prévenir le XSS ?
Uniquement pour les contextes de texte et d'attribut HTML, et seulement appliqué à la sortie. Le contenu injecté dans JavaScript, CSS ou une URL nécessite les règles d'échappement de ce langage à la place. L'échappement est une couche, pas une défense complète.
Entités nommées ou numériques — laquelle utiliser ?
Les références numériques sont universalement prises en charge et fonctionnent pour n'importe quel point de code. Les références nommées sont plus lisibles pour la poignée que tout le monde reconnaît. En pratique, utilisez le nommé pour les cinq caractères de base et le numérique pour tout ce qui est inhabituel.
Dois-je encoder les caractères accentués ?
Pas dans un document UTF-8, qui est essentiellement tout le contenu web moderne. Écrivez-les directement. Utilisez le mode étendu seulement quand quelque chose dans votre pipeline ne peut pas être tenu de transporter les octets non ASCII intacts.
Quelle est la différence entre et une espace normale ?
Une espace insécable est le point de code U+00A0. Elle ressemble à la même mais empêche le retour à la ligne et n'est pas fusionnée avec les espaces adjacents. C'est aussi un caractère distinct pour les comparaisons, ce qui en fait une source courante de bugs subtils.