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 ?
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 ?
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)
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. :/ /.
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.
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
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
@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."
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.
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.
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.
" 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.
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.
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.
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'optionJSON_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));
0 votes
Le code inclut-il le '</' : ou commence-t-il par echo ? Parce que commencer par echo ne fonctionne pas pour moi. Je n'obtiens tout simplement rien. Oui, j'ai remplacé mon $obj par ma variable :)
1 votes
JSON n'échappe ou ne sérialise rien... votre sérialiseur JSON le fait. Lequel utilisez-vous ?