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

251

Sont-ils les mêmes que XML, peut-être plus l'espace un (  )?

J'ai trouvé d'énormes listes de caractères d'échappement HTML mais je ne pense pas qu'ils doivent être échappés. Je veux savoir ce qui doit être échappé.

Ahmet
la source

Réponses:

318

Si vous insérez du contenu textuel dans votre document à un emplacement où le contenu textuel est attendu 1 , vous n'avez généralement besoin que d'échapper les mêmes caractères que vous le feriez en XML . À l'intérieur d'un élément, cela inclut simplement l'esperluette d'échappement de l'entité &et le délimiteur d'élément signe 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 guillemet 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 à vous échapper des cinq dans tous les cas pour réduire le risque de faire une erreur.

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

En général, vous ne devez pas échapper aux 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 de l'espace supplémentaire sans qu'il soit automatiquement réduit, mais c'est généralement un cas rare. Ne faites cela que si vous avez une contrainte de conception qui l'exige.


1 Par "un emplacement où du contenu textuel est attendu", je veux dire à l'intérieur d'un élément ou d'une valeur d'attribut entre guillemets où les règles d'analyse normales s'appliquent. Par exemple: <p>HERE</p>ou <p title="HERE">...</p>. Ce que j'ai écrit ci - dessus ne s'applique pas au contenu qui a des règles ou une signification d'analyse spéciales, telles que l'intérieur d'un script ou d'une balise de style, ou en tant que nom d'élément ou 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écourage fortement de ne jamais insérer de contenu dynamique dans aucun de ces emplacements. J'ai vu des équipes de développeurs compétents soucieux de la sécurité introduire des vulnérabilités en supposant qu'ils avaient encodé ces valeurs correctement, mais sans un cas limite. Il existe généralement une alternative plus sûre, comme mettre la valeur dynamique dans un attribut puis la gérer avec JavaScript.

Si vous devez le faire, veuillez lire les règles de prévention XSS du projet de sécurité des applications Web ouvertes pour vous aider à comprendre certaines des préoccupations que vous devrez garder à l'esprit.

Jeremy Banks
la source
2
Certaines valeurs d'attribut HTML peuvent également avoir une signification spéciale (JS / CSS). Donc, cela ne s'applique pas non plus à ceux-ci, par exemple:<p onclick="NOT-HERE">...</p> et <p style="NOT-HERE">...</p>.
geekley
21

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

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

Consultez la feuille de triche sur la prévention des scripts intersites de l'OWASP , en particulier le document « Pourquoi ne puis-je pas simplement coder des données non approuvées par une entité HTML? sections " Et " Règles de prévention XSS ". Cependant, il est préférable de lire l'intégralité du document.

daxelrod
la source
9

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, donc 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 (") as" et des guillemets simples (') as & apos

Évitez de mettre du contenu dynamique dans <script>et <style>. Ces règles ne sont pas applicables pour eux. Par exemple, si vous devez inclure JSON dans a, remplacez <par \ x3c, le caractère U + 2028 par \ u2028 et U + 2029 avec \ 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 & lorsqu'il est suivi de tout ce qui pourrait commencer une référence de caractère. 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 y mettre fin à la valeur d'attribut, échappez au 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 la plupart des échappements et simplement travailler avec des caractères. Notez cependant que pour changer l'encodage de votre document, il ne suffit pas de simplement changer la déclaration d'encodage en haut de page ou sur le serveur. Vous devez réenregistrer votre document dans cet encodage. Pour savoir comment procéder avec votre application, consultez la section Définition du codage dans les applications de création Web.

Personnages 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 DROIT À GAUCHE. Ce caractère peut être utilisé pour clarifier la directionnalité dans le texte bidirectionnel (par exemple lors de l'utilisation des scripts arabe ou hébreu). Cependant, il n'a pas de forme graphique, il est donc difficile de voir 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 d'une édition ultérieure. L'utilisation de (ou de son équivalent de référence de caractère numérique) à la place facilite le repérage de ces caractères.

Un exemple de caractère ambigu est U + 00A0 ESPACE NO-BREAK. Ce type d'espace empêche les sauts de ligne, mais il ressemble à n'importe quel autre espace lorsqu'il est utilisé comme caractère. L'utilisation indique clairement où ces espaces apparaissent dans le texte.

Alireza
la source
3

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 constitués de caractères Unicode, ne doivent pas contenir de caractères U + 0000, ne doivent pas contenir de caractères Unicode définitivement non définis (non-caractères) et ne doivent pas contenir de caractères de contrôle autres que des caractères d'espace. Cette spécification inclut des contraintes supplémentaires sur la valeur exacte des nœuds de texte et les 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 pouvant être échappé.

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

... ne doit contenir aucun espace littéral, aucun caractère U + 0022 QUOTATION MARK ("), U + 0027 APOSTROPHE ('), U + 003D EQUALS SIGN (=), U + 003C LESS-THAN SIGN ( <), Les caractères U + 003E GREATER-THAN SIGN (>) ou U + 0060 GRAVE ACCENT (`), et ne doivent pas être la chaîne vide.

Andrey
la source