web-dev-qa-db-fra.com

Où puis-je trouver une liste des caractères d'échappement requis pour mon type de retour JSON ajax?

J'ai une action ASP.NET MVC qui renvoie un objet JSON.

Le JSON:

{status: "1", message:"", output:"<div class="c1"><div class="c2">User generated text, so can be anything</div></div>"}

Actuellement, mon HTML le brise. Il y aura du texte généré par l'utilisateur dans le champ de sortie, donc je dois m'assurer que j'échappe à TOUT ce qui doit être échappé.

Quelqu'un a-t-il une liste de toutes les choses pour lesquelles je dois m'échapper?

Je n'utilise aucune bibliothèque JSON, je construis juste la chaîne moi-même.

43
Blankman

Jetez un œil à http://json.org/ . Il revendique une liste de personnages échappés un peu différente de celle proposée par Chris.

\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
75
Pashec

Voici une liste de caractères spéciaux auxquels vous pouvez échapper lors de la création d'un littéral de chaîne pour JSON:

\b Retour arrière (code ASCII 08) 
\f Saut de page (code ASCII 0C) 
\n Nouvelle ligne 
\r Retour chariot 
\t Onglet 
\v Onglet vertical 
\'Apostrophe ou guillemet simple 
\"Citation double 
 \\ Caractère barre oblique inverse 

Référence: littéraux chaîne

Certains d'entre eux sont plus facultatifs que d'autres. Par exemple, votre chaîne doit être parfaitement valide que vous échappiez au caractère de tabulation ou que vous laissiez un littéral de tabulation. Vous devriez certainement gérer la barre oblique inverse et les guillemets.

52
Chris Nielsen

Comme expliqué dans la section 9 des spécifications officielles de l'ECMA ( http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ) en JSON, les éléments suivants les caractères doivent être échappés:

  • U+0022 (", le guillemet)
  • U+005C (\, la barre oblique inverse ou le solidus inversé)
  • U+0000 à U+001F (les caractères de contrôle ASCII)

De plus, afin d'incorporer JSON en toute sécurité dans HTML, les caractères suivants doivent également être échappés:

  • U+002F (/)
  • U+0027 (')
  • U+003C (<)
  • U+003E (>)
  • U+0026 (&)
  • U+0085 (Ligne suivante)
  • U+2028 (Séparateur de ligne)
  • U+2029 (Séparateur de paragraphes)

Certains des caractères ci-dessus peuvent être échappés avec les courtes séquences d'échappement suivantes définies dans la norme:

  • \" représente le caractère guillemet (U + 0022).
  • \\ représente le caractère solidus inverse (U + 005C).
  • \/ représente le caractère solidus (U + 002F).
  • \b représente le caractère de retour arrière (U + 0008).
  • \f représente le caractère de saut de page (U + 000C).
  • \n représente le caractère de saut de ligne (U + 000A).
  • \r représente le caractère de retour chariot (U + 000D).
  • \t représente le caractère de tabulation des caractères (U + 0009).

Les autres caractères à échapper utiliseront le \uXXXX notation, c'est-à-dire \u suivi des quatre chiffres hexadécimaux qui codent le point de code.

Le \uXXXX peut également être utilisé à la place de la séquence d'échappement courte, ou éventuellement pour échapper tout autre caractère du plan multilingue de base (BMP).

10
Andrei Bozantan

De la spec :

Tous les caractères peuvent être placés entre guillemets à l'exception des caractères qui doivent être échappés: guillemet (U + 0022), solidus inverse [barre oblique inverse] (U + 005C) et les caractères de contrôle U + 0000 à U + 001F

Tout simplement parce que par exemple Bell (U + 0007) n'a pas de code d'échappement à un seul caractère ne signifie pas que vous n'avez pas besoin de l'échapper. Utilisez la séquence d'échappement Unicode \u0007.

5
Kevin Smyth

Tout de suite, je peux dire qu'au moins les guillemets doubles dans les balises HTML vont être un problème. Ce sont probablement tout ce dont vous aurez besoin pour vous échapper afin qu'il soit JSON valide; il suffit de remplacer

"

avec

\"

En ce qui concerne la sortie du texte saisi par l'utilisateur, vous devez vous assurer de l'exécuter via HttpUtility.HtmlEncode () pour éviter attaques XSS et pour vous assurer qu'il ne gâche pas le formatage de votre page .

5
Jarett Millard

La référence JSON indique:

 tout caractère Unicode - 
 sauf - "- ou - \\ - ou - 
 caractère de contrôle 

Répertorie ensuite les codes d'échappement standard:

\"Devis JSON standard 
 \\ Barre oblique inverse (caractère d'échappement) 
 \/Barre oblique avant 
\B Retour arrière (code ascii 08) 
\f Saut de page (code ascii 0C) 
\n Nouvelle ligne 
\r Retour chariot 
\t Onglet horizontal 
\u quatre chiffres hexadécimaux 

De cela, j'ai supposé que je devais échapper à tous ceux répertoriés et tous les autres sont facultatifs. Vous pouvez choisir d’encoder tous les caractères en \uXXXX si vous le souhaitez, ou si vous ne pouvez faire que des caractères 7 bits non imprimables ASCII caractères ou caractères avec la valeur Unicode absente de \u0020 <= x <= \u007E intervalle (32 - 126). De préférence, faites d'abord les caractères standard pour des codes d'échappement plus courts et donc une meilleure lisibilité et de meilleures performances.

De plus, vous pouvez lire le point 2.5 (Chaînes) dans RFC 4627 .

Vous pouvez (ou ne pas vouloir) échapper (davantage) à d'autres caractères selon l'endroit où vous incorporez cette chaîne JSON, mais cela sort du cadre de cette question.

4
Marius