web-dev-qa-db-fra.com

Dois-je vraiment encoder '' comme 'amp;'?

J'utilise un symbole '&' avec HTML5 et UTF-8 dans le <title> de mon site. Google affiche bien les esperluettes sur ses SERP, ainsi que tous les navigateurs dans leurs titres.

http://validator.w3.org me donne ceci:

& n'a pas commencé une référence de personnage. (& aurait probablement dû être échappé en tant que &amp;.)

Dois-je vraiment faire &amp;?

Je ne suis pas gêné par le fait que mes pages soient validées pour être validées, mais je suis curieuse d'entendre l'opinion des gens à ce sujet et si c'est important et pourquoi.

192
Haroldo

Oui. Comme le dit l'erreur, en HTML, les attributs sont #PCDATA, ce qui signifie qu'ils sont analysés. Cela signifie que vous pouvez utiliser des entités de caractères dans les attributs. Utiliser & par lui-même est faux et sans les navigateurs indulgents et le fait qu'il s'agisse de HTML et non de XHTML, l'analyse serait brisée. Échappez-vous simplement comme &amp; et tout irait bien.

HTML5 vous permet de ne pas la masquer, mais uniquement lorsque les données suivantes ne ressemblent pas à une référence de caractère valide. Cependant, il est préférable d'échapper à toutes les occurrences de ce symbole plutôt que de se demander lesquelles devraient ou non être nécessaires.

Gardez ce point à l'esprit; Si vous n'échappez pas à amp ;, c'est assez pour les données que vous créez (où le code pourrait très bien être invalide), vous risquez également de ne pas échapper aux délimiteurs de balises, ce qui est un énorme problème pour les données soumises par l'utilisateur, pourrait très bien conduire à l’injection de HTML et de script, au vol de cookies et à d’autres exploits.

Veuillez juste échapper votre code. Cela vous évitera beaucoup de problèmes à l'avenir.

134
Delan Azabani

Mis à part la validation, il reste que l’encodage de certains caractères est important pour un document HTML afin qu’il puisse être restitué correctement et en toute sécurité en tant que page Web.

Encoder & comme &amp; dans toutes les circonstances est, pour moi, une règle plus facile à respecter, réduisant ainsi le risque d'erreur et d'échec.

Comparez ce qui suit: lequel est le plus facile? ce qui est plus facile pour enculer?

Méthodologie 1

  1. Ecrire du contenu qui comprend des caractères esperluette.
  2. Encode-les tous.

Méthodologie 2

(avec un grain de sel, s'il vous plaît;))

  1. Ecrire du contenu qui comprend un esperluette.
  2. Au cas par cas, examinez chaque esperluette. Déterminez si:
    • Il est isolé et constitue sans ambiguïté une esperluette. par exemple. volt & amp
      > Dans ce cas, ne vous embêtez pas pour le coder.
    • Il n’est pas isolé, mais vous estimez qu’il en est néanmoins sans ambiguïté, car l’entité résultante n’existe pas et n’existera jamais car la liste d’entités ne pourrait jamais évoluer. par exemple amp&volt
      > Dans ce cas, ne vous embêtez pas pour le coder.
    • Ce n'est pas isolé et ambigu. par exemple. volt&amp
      > Encodez-le.

??

52
Richard JP Le Guen

J’ai effectué des recherches approfondies à ce sujet et écrit mes conclusions ici: http://mathiasbynens.be/notes/ambiguous-ampersands

J’ai également créé n outil en ligne que vous pouvez utiliser pour vérifier dans votre balise des esperluettes ambiguës ou des références de caractère ne se terminant pas par un point-virgule, qui sont tous deux invalides. (Aucun validateur HTML ne le fait actuellement correctement.)

http://i.imgur.com/cLssU.png

31
Mathias Bynens

Les règles HTML5 sont différentes de HTML4. Ce n'est pas obligatoire en HTML5 - à moins que l'esperluette ne ressemble à un nom de paramètre. "copie = 2" est toujours un problème, par exemple, depuis la copie; est le symbole du copyright.

Cependant, il me semble qu’il est plus difficile de décider d’encoder ou de ne pas encoder en fonction du texte suivant. Donc, le chemin le plus facile est probablement de coder tout le temps.

19
Matthew Wilson

Je pense que cela s'est transformé en une question de "pourquoi suivre les spécifications lorsque le navigateur ne s'en soucie pas". Voici ma réponse généralisée:

Les normes ne sont pas une chose "présente". Ils sont une chose "future". Si nous, en tant que développeurs, suivons les normes Web, les éditeurs de navigateurs sont plus susceptibles de les appliquer correctement et nous nous rapprochons d'un site Web totalement interopérable, où les piratages CSS, la détection de fonctionnalités et la détection de navigateur ne sont pas nécessaires. Où nous n'avons pas à comprendre pourquoi nos mises en page sont modifiées dans un navigateur particulier ou comment résoudre ce problème.

Plus précisément, si HTML5 ne nécessite pas d’utilisation d’amp; Dans votre situation spécifique, et que vous utilisez un doctype HTML5 (et attendez également de vos utilisateurs qu'ils utilisent des navigateurs compatibles HTML5), il n'y a aucune raison de le faire.

13
Ryan Kinal

Eh bien, si cela provient des entrées de l'utilisateur, alors absolument, pour des raisons évidentes. Pensez si ce site Web ne l’a pas fait: le titre de cette question s’afficherait sous la forme ai-je vraiment besoin de coder "&" comme "&"?

Si c'est juste quelque chose comme echo '<title>Dolce & Gabbana</title>'; alors à proprement parler, vous n'êtes pas obligé. Ce serait mieux, mais si vous ne le faites pas, aucun utilisateur ne remarquera la différence.

5
Thomas Bonini

Pourriez-vous nous montrer ce que votre title est réellement? Quand je soumets

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

à http://validator.w3.org/ - lui demandant explicitement d'utiliser le mode expérimental HTML 5 - il a rien à redire sur le &s ...

5
AakashM

En HTML, un & marque le début d'une référence, soit référence du caractère , soit référence de l'entité . À partir de ce moment, l'analyseur attend un # désignant une référence de caractère ou un nom d'entité désignant une référence d'entité, tous deux suivis d'un ;. C’est le comportement normal.

Mais si le nom de référence ou simplement l'ouverture de référence & est suivi d'un espace ou de délimiteurs tels que ", ', <, >, &, la fin ; et même une référence représentant un simple & peuvent être omis:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

Ce n'est que dans ces cas que la fin ; ou même la référence elle-même peut être omise (au moins en HTML 4). Je pense que HTML 5 nécessite la fin ;.

Mais le spécification recommande de toujours utiliser une référence comme la référence du caractère &#38; ou la référence de l'entité &amp; pour éviter toute confusion:

Les auteurs doivent utiliser "&amp;" (décimal en ASCII 38) au lieu de "&" pour éviter toute confusion avec le début d'une référence de caractère (délimiteur ouvert de référence d'entité). Les auteurs doivent également utiliser "&amp;" dans les valeurs d'attribut, car les références de caractère sont autorisées dans les valeurs d'attribut CDATA.

4
Gumbo

Si l'utilisateur vous le transmet, ou si cela aboutira à une URL, vous devez y échapper.

S'il apparaît en texte statique sur une page? Tous les navigateurs auront ce droit dans les deux cas, vous ne vous inquiétez pas beaucoup, car cela fonctionnera.

3
Dean J

Il y a quelques années, nous avons reçu un rapport signalant qu'une de nos applications Web ne s'affichait pas correctement dans Firefox. Il s'est avéré que la page contenait une balise ressemblant à

<div style="..." ... style="...">

Lorsqu'il est confronté à un attribut de style répété, IE combine les deux styles, tandis que Firefox n'en utilise qu'un seul, d'où un comportement différent. J'ai changé le tag en

<div style="...; ..." ...>

et bien sûr, ça a réglé le problème! La morale de l'histoire est que les navigateurs ont un traitement plus cohérent du code HTML valide que du code HTML non valide. Alors, corrigez déjà votre fichu balisage! (Ou utilisez HTML Tidy pour le réparer.)

2
dan04

Oui, vous devriez essayer de servir un code valide si possible.

La plupart des navigateurs corrigent cette erreur en silence, mais il existe un problème de gestion des erreurs dans les navigateurs. Il n'existe pas de norme pour la gestion du code incorrect. Il appartient donc à chaque fournisseur de navigateur d'essayer de déterminer quoi faire avec chaque erreur. Les résultats peuvent varier.

Certains exemples où les navigateurs sont susceptibles de réagir différemment sont si vous placez des éléments dans un tableau mais en dehors des cellules du tableau, ou si vous imbriquez des liens les uns dans les autres.

Pour votre exemple spécifique, cela ne posera probablement aucun problème, mais une correction d'erreur dans le navigateur pourrait, par exemple, faire passer le navigateur du mode conforme aux normes au mode quirks, ce qui pourrait entraîner une dégradation totale de votre présentation.

Donc, vous devriez corriger les erreurs comme celle-ci dans le code, sinon pour toute autre chose, donc gardez la liste des erreurs dans le validateur trop courte, afin que vous puissiez repérer des problèmes plus graves.

2
Guffa

Je vérifiais pourquoi l'URL de l'image devait échapper, c'est pourquoi je l'ai essayé dans https://validator.w3.org . L'explication est jolie Nice. Il souligne que même les URL doivent être échappées. [PS: Je suppose que cela ne sera pas échappé quand il sera consommé puisque les URL ont besoin de &. Quelqu'un peut-il clarifier?]

<img alt="" src="foo?bar=qut&qux=fop" />

Une référence à une entité a été trouvée dans le document, mais aucune référence portant ce nom n'a été définie. Cela est souvent dû à une mauvaise orthographe du nom de référence, à des esperluettes non codées ou à l'absence du point-virgule (;). La cause la plus fréquente de cette erreur est l'esperluette non codée dans les URL, comme décrit par le WDG dans "Esperluettes dans les URL". Les références d'entité commencent par une esperluette (&) et se terminent par un point-virgule (;). Si vous souhaitez utiliser une esperluette littérale dans votre document, vous devez l'encoder comme "&" (même à l'intérieur des URL!). Veillez à terminer les références d'entité par un point-virgule, sinon votre référence à une entité peut être interprétée en relation avec le texte suivant. N'oubliez pas non plus que les références d'entités nommées sont sensibles à la casse. & Aelig; et æ sont des personnages différents. Si cette erreur apparaît dans un balisage généré par le code de traitement de session de PHP, cet article contient des explications et des solutions à votre problème.

2
Nishant

Cela dépend de la probabilité qu'un point-virgule finisse près de votre &, ce qui le fait afficher quelque chose de très différent.

Par exemple, lorsque vous manipulez les entrées d'utilisateurs (par exemple, si vous incluez le sujet d'une publication de forum fourni par l'utilisateur dans vos balises de titre), vous ne savez jamais où ils pourraient mettre des points-virgules au hasard et des entités étranges pourraient s'afficher de manière aléatoire. Donc, échappez-vous toujours dans cette situation.

Pour votre propre code html statique, vous pouvez le sauter, mais il est si simple d’inclure une évasion correcte qu’il n’ya aucune bonne raison de l’éviter.

1
Douglas

si & est utilisé dans html alors vous devriez y échapper

Si & est utilisé dans les chaînes javascript, par exemple. une alert('This & that'); ou un document.href, vous n'avez pas besoin de l'utiliser.

Si vous utilisez document.write, vous devez l’utiliser par exemple. document.write(<p>this &amp; that</p>)

1
Alex

Si vous parlez vraiment du texte statique

<title>Foo & Bar</title>

stocké dans un fichier sur le disque dur et servi directement par un serveur, alors oui: il n'a probablement pas besoin d'être échappé.

Cependant, comme il y a très très peu de contenu HTML de nos jours complètement statique, j'ajouterai l'avertissement suivant qui suppose que le contenu HTML est généré à partir d'une autre source (contenu de la base de données, utilisateur entrée, résultat de l'appel de service Web, résultat de l'API héritée, ...):

Si vous n'échappez pas à un simple &, il est fort probable que vous n'échappiez pas non plus à un &amp; ou à un &nbsp; ou <b> ou <script src="http://attacker.com/evil.js"> ou à un autre autre texte invalide. Cela signifie que vous affichez au mieux votre contenu de manière incorrecte et que vous êtes probablement suspecté par attaques XSS .

En d’autres termes: lorsque vous vérifiez déjà et échappez aux autres cas plus problématiques, il n’ya pratiquement aucune raison de quitter le groupe autonome, qui n’est pas totalement détruit, mais qui reste un peu louche, et qui n’est pas échappé.

0
Joachim Sauer