436 votes

JSON : pourquoi les barres obliques sont-elles échappées ?

La raison de cette situation m'échappe.

JSON échappe à la barre oblique, de sorte qu'un hachage {a: "a/b/c"} est sérialisé comme {"a":"a\/b\/c"} au lieu de {"a":"a/b/c"} .

Pourquoi ?

4 votes

Pour information, je n'ai jamais vu de slashs avant échappés dans JSON, je viens de le remarquer avec la bibliothèque Java de code.google.com/p/json-simple

33 votes

PHP json_encode() échappe les barres obliques par défaut, mais l'option JSON_UNESCAPED_SLASHES option à partir de PHP 5.4.0 (mars 2012)

10 votes

Voici un code PHP qui n'échappe pas tous les slashs, seulement dans les cas suivants '</' : echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));

340voto

Ruben Points 8393

JSON ne vous oblige pas à le faire, il vous permet de le faire. Il vous permet également d'utiliser " \u0061 "pour "A", mais ce n'est pas obligatoire, comme le souligne Harold L :

La spécification JSON dit que vous pouvez échapper le slash avant, mais vous n'êtes pas obligé de le faire.

Harold L a répondu le 16 Oct '09 à 21:59

Autoriser \/ est utile lorsque l'on intègre JSON dans un <script> qui ne permet pas </ à l'intérieur des cordes, comme le souligne Seb :

En effet, le HTML n'autorise pas l'insertion d'une chaîne de caractères à l'intérieur d'un fichier <script> pour contenir </ donc, si cette sous-chaîne est présente, vous devez échapper à chaque barre oblique.

Seb a répondu le 16 octobre '09 à 22:00 (#1580667)

Certaines API ASP.NET Ajax/JSON de Microsoft utilisent cette faille pour ajouter des informations supplémentaires, par exemple, une date sera envoyée sous la forme suivante "\/Date(milliseconds)\/" . (Beurk)

1 votes

Merci pour la réponse. Je n'avais jamais pensé à ce cas limite. Ils devraient échapper aux occurrences de </ avec <\/], mais pas à toutes les autres barres obliques. :/ /.

4 votes

Ce serait une bonne chose, d'échapper juste </. Bien que JSON ne soit pas souvent intégré dans les balises script de toute façon.

1 votes

Ouais, les cerceaux que les gens ont traversé pour le HTML... c'est maintenant la 2ème surprise récente pour moi concernant JSON. L'autre était que Infinity et NaN ne sont pas sérialisés. stackoverflow.com/questions/1423081

47voto

Harold L Points 3340

La spécification JSON dit que vous pouvez échapper le slash avant, mais vous n'êtes pas obligé de le faire.

10 votes

Pouvez-vous ajouter un lien vers cette section spécifique ?

1 votes

La spécification ne dit pas ça. En fait, tout ce qu'elle dit est que vous devez échapper au caractère solidus. Voir ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

14 votes

@JoaEbert : Un solidus inversé doit être échappé, mais vous n'avez pas besoin d'échapper à un solidus. La section 9 dit : "Tous les caractères peuvent être placés à l'intérieur des guillemets, à l'exception des caractères qui doivent être échappés : guillemet (U+0022), solidus inversé (U+005C) et les caractères de contrôle U+0000 à U+001F."

29voto

Seb Points 17238

En effet, le HTML n'autorise pas l'insertion d'une chaîne de caractères à l'intérieur d'un fichier <script> pour contenir </ donc, si cette sous-chaîne est présente, vous devez échapper à chaque barre oblique.

22voto

Boldewyn Points 29961

J'ai demandé la même question il y a quelque temps et j'ai dû y répondre moi-même. Voici ce que j'ai trouvé :

Il semble, ma première pensée [ qu'il provient de son JavaScript racines était correct.

'\/' === '/' en JavaScript, et JSON est JavaScript valide. Cependant, pourquoi les autres échappements ignorés (comme le \z ) ne sont pas autorisés dans JSON ?

La clé pour cela était de lire http://www.cs.tut.fi/~jkorpela/www/revsol.html suivi par http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2 . La fonctionnalité de l'échappement de la barre oblique permet à JSON d'être intégré dans le HTML (comme SGML) et le XML.

7 votes

Un mécanisme de livraison de données structurées ne devrait pas être lié à des constructions de langage, car cela pourrait changer à l'avenir, mais cela pourrait expliquer les décisions de conception si les créateurs de JSON en avaient.

1 votes

'\/' === '/' Je n'ai donc pas besoin de supprimer les barres obliques lors de la réception de mon jsonp ?

19voto

Simon Points 4467

PHP échappe les slashs avant par défaut c'est probablement la raison pour laquelle cela apparaît si souvent. Je ne suis pas sûr de la raison, mais peut-être parce que l'intégration de la chaîne de caractères "</script>" à l'intérieur d'un <script> est considérée comme dangereuse.

Cette fonctionnalité peut être désactivée en passant l'option JSON_UNESCAPED_SLASHES mais la plupart des développeurs ne l'utiliseront pas puisque le résultat original est déjà un JSON valide.

3 votes

" est considérée comme dangereuse "-> ce n'est vraiment pas sûr. Exploit : <script>let the = "bodies </script><script>alert("the floor");</script>";</script> Essayez-le, les corps alerteront le sol plutôt que de recevoir une variable appelée 'the' avec des balises script dans sa valeur. Vous pouvez dire "alors ne l'intégrez pas dans une page", ouais, c'est une solution de contournement possible, mais beaucoup de gens le font de toute façon (alors faisons juste de bonnes fonctions d'échappement parce que pourquoi pas) et franchement je comprends leur point de vue : il serait logique s'il était sûr d'avoir des données JSON avec des valeurs de données correctement échappées en JavaScript.

2 votes

Merci @Luc - excellent exemple de la raison pour laquelle PHP a choisi d'échapper les slashs par défaut ! Les fonctions devraient être sécurisées par défaut, et seulement non sécurisées quand vous le voulez spécifiquement.

0 votes

Da meilleur, merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X