web-dev-qa-db-fra.com

Quels caractères doivent être échappés en HTML?

Sont-ils les mêmes que XML, peut-être plus le premier ( )?

J'ai trouvé des listes énormes de caractères d'échappement HTML, mais je ne pense pas qu'ils doivent être échappés. Je veux savoir quoi a besoin pour être échappé.

222
Ahmet

Si vous insérez du contenu textuel dans votre document à un emplacement où le contenu textuel est attendu1, vous n'avez généralement besoin que d'échapper aux mêmes caractères que dans XML . À l'intérieur d'un élément, cela inclut simplement l'entité d'échappement esperluette & et le délimiteur d'élément signes inférieur et supérieur à <>:

& becomes &amp;
< becomes &lt;
> becomes &gt;

À l'intérieur des valeurs d'attribut, vous devez également échapper le caractère de citation que vous utilisez:

" becomes &quot;
' becomes &#39;

Dans certains cas, il peut être prudent de ne pas échapper certains de ces personnages, mais je vous encourage à les échapper tous les cinq dans tous les cas afin de réduire les risques d'erreur.

Si le codage de votre document ne prend pas en charge tous les caractères que vous utilisez, par exemple si vous essayez d'utiliser emoji dans un document codé en ASCII, vous devez également y échapper. De nos jours, la plupart des documents sont codés à l'aide du codage UTF-8 entièrement compatible Unicode, ce qui ne sera pas nécessaire.

En général, vous ne devriez pas échapper d'espaces comme &nbsp;. &nbsp; n'est pas un espace normal, c'est un espace insécable . Vous pouvez les utiliser à la place des espaces normaux pour empêcher l'insertion d'un saut de ligne entre deux mots, ou pour insérer un espace supplémentaire sans le réduire automatiquement, mais il s'agit généralement d'un cas rare. Ne le faites pas sauf si vous avez une contrainte de conception qui l'exige.


1 Par "un emplacement où du contenu textuel est attendu", j'entends à l'intérieur d'un élément ou d'une valeur d'attribut citée où les règles d'analyse syntaxique normales s'appliquent. Par exemple: <p>HERE</p> ou <p title="HERE">...</p>. Ce que j'ai écrit ci-dessus ne s'applique pas à un contenu comportant des règles d'analyse syntaxiques ou une signification particulière, comme à l'intérieur d'un script ou d'une balise de style, ou en tant qu'élément ou Nom d'attribut. Par exemple: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script> ou <p NOT-HERE="...">...</p>.

Dans ces contextes, les règles sont plus compliquées et il est beaucoup plus facile d'introduire une vulnérabilité de sécurité. Je vous déconseille vivement d'insérer du contenu dynamique dans l'un de ces emplacements. J'ai vu des équipes de développeurs compétents en sécurité qui introduisaient des vulnérabilités en supposant qu'ils codé ces valeurs correctement, mais il manque un cas Edge. Il existe généralement une alternative plus sûre, telle que l'insertion de la valeur dynamique dans un attribut, puis sa gestion avec JavaScript.

Si vous devez le faire, veuillez lire Règles de prévention XSS du projet Open Web Application Security pour vous aider à comprendre certaines des préoccupations que vous devez prendre en compte.

269
Jeremy Banks

Cela dépend du contexte. Quelques contextes possibles en HTML:

  • corps du document
  • dans les attributs communs
  • balises de script à l'intérieur
  • balises de style à l'intérieur
  • plusieurs autres!

Reportez-vous à OWASP Aide-mémoire sur la prévention des scripts sur plusieurs sites , en particulier " Pourquoi ne puis-je pas simplement encoder des données non fiables d'entité HTML? )" Et " Règles de prévention XSS = "sections. Cependant, il est préférable de lire le document en entier.

21
daxelrod

Fondamentalement, il y a trois caractères principaux qui doivent toujours être échappés dans vos fichiers HTML et XML, afin qu'ils n'interagissent pas avec le reste des balises, comme vous vous en doutez probablement, deux d'entre eux seront les wrappers de syntaxe, qui sont <>, ils sont listés ci-dessous:

 1)  &lt; (<)

 2)  &gt; (>)

 3)  &amp; (&)

Nous pouvons également utiliser des guillemets doubles (") comme" et des guillemets simples (') comme & apos

Évitez de mettre du contenu dynamique dans <script> et <style>. Ces règles ne s'appliquent pas à ces règles. Par exemple, si vous devez inclure JSON dans un, remplacez <par\x3c, le caractère U + 2028 par\u2028 et U + 2029 par\u2029 après la sérialisation JSON.)

Caractères d'échappement HTML: Liste complète: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Vous devez donc échapper à <, ou & quand est suivi de tout ce qui pourrait commencer une référence de personnage. De plus, la règle sur les esperluettes est la seule règle de ce type pour les attributs entre guillemets, car le guillemet correspondant est la seule chose qui en terminera un. Mais si vous ne souhaitez pas terminer la valeur de l'attribut ici, échappez le guillemet.

Passer à UTF-8 signifie ré-enregistrer votre fichier:

L'utilisation du codage de caractères UTF-8 pour votre page signifie que vous pouvez éviter le recours à la plupart des échappées et travailler uniquement avec des caractères. Notez cependant que pour changer le codage de votre document, il ne suffit pas de changer la déclaration de codage en haut de la page ou sur le serveur. Vous devez ré-enregistrer votre document dans cet encodage. Pour vous aider à comprendre comment faire cela avec votre application, lisez Définition du codage dans les applications de création Web.

Caractères invisibles ou ambigus:

Un rôle particulièrement utile pour les échappées est de représenter des personnages invisibles ou ambigus dans leur présentation.

Un exemple serait le caractère Unicode U + 200F MARQUE DROITE À GAUCHE. Ce caractère peut être utilisé pour clarifier la direction dans un texte bidirectionnel (par exemple, en utilisant les scripts arabe ou hébreu). Toutefois, comme il n’a pas de forme graphique, il est difficile de savoir où se trouvent ces caractères dans le texte et, s’ils sont perdus ou oubliés, ils pourraient créer des résultats inattendus lors de la modification ultérieure. Utiliser (ou son équivalent numérique de référence de caractère) à la place rend très facile de repérer ces caractères.

U + 00A0 NO-BREAK SPACE est un exemple de caractère ambigu. Ce type d’espace évite les sauts de ligne, mais il ressemble à n’importe quel autre espace utilisé comme personnage. Utiliser permet de voir clairement où de tels espaces apparaissent dans le texte.

7
Alireza

La réponse exacte dépend du contexte. En général, ces caractères ne doivent pas être présents ( HTML 5.2 §3.2.4.2.5 ):

Les nœuds de texte et les valeurs d'attribut doivent être composés de caractères Unicode, ne doivent pas contenir de caractères U + 0000, ne doivent pas contenir de caractères Unicode indéfinis (non caractères) et ne doivent pas contenir de caractères de contrôle autres que des caractères d'espacement. Cette spécification inclut des contraintes supplémentaires sur la valeur exacte des nœuds Text et des valeurs d'attribut en fonction de leur contexte précis.

Pour les éléments en HTML, les contraintes du modèle de contenu Texte dépendent également du type d'élément. Par exemple, un "<" à l'intérieur d'un élément textarea n'a pas besoin d'être échappé en HTML car textarea est un élément de texte brut échappable.

Ces restrictions sont dispersées dans la spécification. Par exemple, les valeurs d'attribut ( §8.1.2. ) ne doivent pas contenir de esperluette ambiguë et être soit (i) vide, (ii) entre guillemets simples (et ne doit donc pas contenir du caractère U + 0027 APOSTROPHE '), (iii) entre guillemets doubles (ne doit pas contenir le caractère U + 0022 QUOTATION MARK "), ou ( iv) non cité - avec les restrictions suivantes:

... ne doit contenir aucun caractère d'espace littéral, aucun caractère U + 0022 Marque de citation ("), U + 0027 Caractères APOSTROPHE ('), U + 003D Caractères de signe égal (=), U + 003C Caractères de signe moins important ( <), U + 003E caractères GREAT-THAN SIGN (>), ou U + 0060 Caractères ACCENT graves (`), et ne doit pas être la chaîne vide.

1
Andrey