Dois-je échapper au caractère Apostrophe (') avec son entité HTML (& # 39;)?

38

Quels caractères doivent être échappés avec leurs entités HTML. Par exemple, &est échappé à &.

Devrait 'être échappé avec '?

À M
la source

Réponses:

41

Je n'ai pas les privilèges de commentaire, ou j'aurais laissé cela comme commentaire sur une réponse précédente.

NE PAS, je le répète, NE PAS échapper à une apostrophe en HTML en utilisant

'

Ce n'est pas une référence d'entité de caractère HTML valide. C'est une référence d'entité de caractère XML. Bien que Firefox et Chrome, au moins, rendront ce qui précède comme une apostrophe dans un document HTML, Internet Explorer ne le fera pas. Et il suit la norme quand il refuse de le faire.

Vous pouvez échapper à une apostrophe en HTML en utilisant

'

Mais je ne crois pas que ce soit en général nécessaire.

http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

a dessiné
la source
Je reconnais que cela aurait été correct au moment où cela a été publié, mais si vous regardez l’article de Wikipédia, il apparaît &aposmaintenant valide au format HTML5. Cela dit, si vous devez prendre en charge les anciens navigateurs ou écrire des courriers électroniques HTML pour Outlook, il est préférable de vous y tenir 'si vous estimez qu'il est nécessaire d'échapper au caractère.
Tomhughes
24

Je ne suis pas d'accord avec Nate. Vous devriez idéalement utiliser le moins possible d'échappement et utiliser UTF-8 pour exprimer des caractères de manière native. Pour ce faire, vous avez besoin d'un éditeur capable de gérer UTF-8 ainsi que d'une déclaration de jeu de caractères correcte, telle que:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Cependant, vous devriez prendre l'habitude d'échapper aux caractères qui ont une signification spéciale en (X) HTML, à savoir:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

Cela garantira que vous n'écrivez pas accidentellement du balisage lorsque vous souhaitez écrire ces caractères. Ceci est particulièrement important pour la saisie de l'utilisateur afin de maintenir la sécurité. C'est moins évident, mais il est en fait important de s'échapper ". Si une chaîne aboutit à un attribut HTML ( title="something"etc.), l'utilisateur peut y mettre fin et insérer son propre balisage. Imaginez ce qui se passe si l'utilisateur entre" onclick="alert('hello'); et que vous l'insérez pourtitle="..."

Si vous utilisez PHP, vous pouvez utiliser le htmlspecialchars fonction pour le faire. D'autres langues peuvent avoir d'autres fonctions similaires.

Mise à jour: je suis corrigé sur la question des apos. Damned embêtant IE.

nitro2k01
la source
J'ai deux réponses contradictoires maintenant. L'un recommande de s'échapper, l'autre pas. Que devrais-je croire?
Tom
7
En bref. Vous pouvez ou non y échapper à votre discrétion. Si vous le faites, n'utilisez &#39;pas &apos;. Si, pour une raison quelconque, vous utilisez des guillemets simples pour un attribut HTML, title='something'vous devez évidemment éviter tout guillemet simple à l'intérieur de la valeur de l'attribut.
nitro2k01
ton deuxième paragraphe est ce qui est important pour moi, mon OCD est tombé en
désuétude
6

Cela dépend de votre cas d'utilisation, mais nous devrions probablement être découragés d'utiliser 'le langage naturel en général. Par conséquent, le problème ne devrait pas survenir à moins que vous n'ayez un code informatique dans votre code XML.

Lorsque nous traduisons des chaînes, nous constatons que certains traducteurs remplacent les guillemets fermants par des guillemets bouclés unicode, tout en laissant les guillemets droits comme guillemets ouvrants, ce qui les laisse visuellement déséquilibrés et peu professionnels.

Les caractères unicode et devraient remplacer 'si possible, autant que et devrait remplacer ". Ceci est utile car les ordinateurs ne reconnaissent pas la ponctuation bouclée comme spéciale. (Bien que je sois amusé de voir que Stack Overflow / Chrome considère " don’tcomme une faute d’orthographe, alors qu’il est satisfait".don't ».)

Cela n'aide pas que nous ayons les caractères très attrayants 'et "directement sur le clavier.

android.weasel
la source
1

Voyons donc si StackExchange lui-même code une apostrophe en utilisant une entité HTML.

Voici quelques exemples du code source de cette page.

(1) Titre de la question: Encodé.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) a tiré la réponse: Non codé.

But I don't believe it is, in general, necessary.

(3) Commentaire de Tom sur la réponse de nitro2k01: Encodé.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Donc, ça va dans les deux sens.

Cependant, le code source de cette page ne l'utilise jamais &apos;. Tous les encodages sont de la forme &#39;. Ceci est compatible avec nitro2k01 et le conseil de Drew de ne pas utiliser &apos;.

jkdev
la source
1
Bien que dans les 3 cas, il n'est pas nécessaire de coder HTML.
MrWhite
1

Où va cette ficelle?

Votre réponse dépend du contexte:

  1. Si vous écrivez un paragraphe en HTML avec ces données, il suffira peut-être d'échapper à <,> et &:

    <p>{string}</p>

  2. Si vous écrivez dans un attribut HTML, cependant, comme

    <a href='/some/path/{string}'>...</a>

Ensuite, vous devez absolument échapper à l'apostrophe. Cela peut être un vecteur d’attaque si un attaquant l’a mis dans string:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. Même chose pour les guillemets doubles. J'ai même lu que le backtick `est vulnérable, car il pourrait aussi être utilisé pour les attributs HTML. Si vous ne disposez pas d'un script de vérification de la syntaxe HTML automatique dans vos routines de déploiement, supposez que l'un de ces trois programmes peut être utilisé et qu'il doit être échappé pour les attributs HTML.

  2. À la limite, même les attributs non-cités sont valides, le caractère d'espacement devra également être échappé. Et !, @, $, %, (, ), =, +, {, }, [et] , qui peuvent tous sortir d'un attribut et permettre l' insertion d' un nouveau.

Ce que je fais

Pour échapper à JavaScript, j'utilise JQuery $(element).text(string)ou $(element).attr(attrname, string)à l'échappement pour moi. Soyez très prudent avec$(element).html(unsafe) ce qui n'échappe pas à votre code HTML!

Sur le code côté serveur, je dois évaluer soigneusement le risque pour chaque cas et lire attentivement la documentation. Cela dépendra du langage et des bibliothèques que vous utilisez, comme Rails, Django, PHP brut, Drupal, etc.

Bases de données

Si vous envisagez d'arrêter le problème le plus tôt possible, tenez vos chevaux avant même qu'il ne soit enregistré dans votre base de données. HTML-échapper le texte stocké dans votre base de données peut vous emmener dans un tour d'enfer. Que faire si vous souhaitez autoriser ultérieurement certaines balises HTML, mais pas d'autres, telles que l'italique, le gras, les couleurs et les tableaux? Que se passe-t-il si vous avez manqué quelque chose lors de votre premier passage, mais que votre échappeur se soit déjà échappé au &fur &amp;et à "mesure &quot;? Va-t-il transformer ceux-ci en &amp;amp;et&amp;quot; ?

Mon approche consiste à exécuter uniquement l'échappement SQL pour la base de données, tout en laissant tous les caractères spéciaux HTML dans le traitement ultérieur. De cette façon, je peux déboguer et ajuster facilement mes échappements HTML. Cela signifie aussi que je ne peux pas faire confiance à mes propres tables SQL si elles ont des chaînes fournies par l'utilisateur.

Moral

Ne faites jamais confiance aux entrées contrôlées par l'utilisateur et citez toujours vos attributs HTML!

Basé sur: L'échappement HTML ne se limite pas à &, <,> et " par Ryan Grove

Chaim-Leib Halbert
la source
-1

Si votre apostrophe appartient au contenu, n'y échappez pas. Tous les autres caractères de contenu pouvant être confondus avec du code, y échappent.

Soleil
la source
"Si ton apostrophe appartient au contenu, échappe-lui." - Cela semblerait être incorrect (comme s'il manquait le mot "ne pas"). Si l'apostrophe fait partie du contenu, n'y échappez pas - vous ne devriez pas en avoir besoin.
MrWhite
-4

Le moyen le plus simple de faire le travail sans utiliser l'entité réelle est d'utiliser les fonctions htmlentities()ou htmlspecialchars()fonctions de PHP :

$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
  $val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'> 
  <head>
    <meta http-equiv='Content-type' content='text/html;charset=utf-8' />
    <title>Special Characters</title>
    <style type='text/css'>
      @import 'special.css';
    </style>
  </head>
<body>
  <form method='post' action='' id='fm' name='fm'>
    <input type='text' value='$val' name='val' id='val' />
    <input type='submit' value='submit' name='sub' id='sub' />
  </form>
</body>
  <script type='text/javascript' src='special.js'></script>
</html>";
La Congrégation
la source
4
Est-ce une farce?
Dim '17
@Su 'J'ai bien peur que ce ne soit pas ...
William Edwards