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.
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
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.
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).
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
.
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 .
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.