JSON: pourquoi sont des barres obliques échappé?
La raison de ce "s'échappe" de moi.
JSON échappe à l'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?
- FWIW, je n'ai jamais vu des barres obliques échappé en JSON, je l'ai juste remarqué avec la bibliothèque Java code.google.com/p/json-simple
- PHP
json_encode()
s'échappe des barres obliques par défaut, mais a laJSON_UNESCAPED_SLASHES
option à partir de PHP 5.4.0 (Mars 2012) - double possible de Pourquoi est la barre oblique un escapable caractère en JSON?
- Voici un code PHP qui n'échappera pas à tous les slash, seulement dans
'</'
:echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
- Le code prévoit l' '</': ou sera-t-elle à l'écho? En raison de départ à l'écho d'échec pour moi. J'ai simplement ne pas obtenir quoi que ce soit. Oui, j'ai remplacé ma $obj pour ma variable 🙂
- JSON n'échappe pas à sérialiser ou quoi que ce soit... votre sérialiseur JSON n'. Lequel utilisez-vous?
Vous devez vous connecter pour publier un commentaire.
JSON ne vous obligent pas à le faire, il vous permet de le faire. Il vous permet également d'utiliser "\u0061" pour "Un", mais il n'est pas nécessaire. Permettant
\/
aide lors de l'intégration de JSON dans un<script>
tag, qui ne permet pas</
à l'intérieur de chaînes, comme Seb souligne.Certains de Microsoft ASP.NET Ajax/JSON API utiliser cette faille pour ajouter des informations supplémentaires, par exemple, un datetime sera envoyé comme
"\/Date(milliseconds)\/"
. (Beurk)var f = <= xxx.to_json %>;
. Il ne doit certainement pas échapper à la tous barres obliques, cela rend chaque JSON URL encodée de plus, au lieu de juste les rares cas de bord.RegExp
pour la norme ISO 8601 pour unDate
objet ou qui ont besoin d'une clé séparée pour indiquer si la valeur sérialisée est un pur chaîne de caractères ou unDate
./
n'est pas obligatoire, c'est permis, afin de faciliter l'utilisation de JSON. Si vous ne voulez pas d'échapper à/
, alors ne le faites pas.</
est tout simplement parfait dans unscript
tag. C'est seulement</script>
(peut-être avec des espaces de là) que de les arrêter.</
à l'intérieur de<script>
(et<style>
). Car, comment un navigateur traiter<div><script>["</div>"]</script>
? Vous pourrait (devrait?) interpréter cela comme<div><script>["</script></div><script>"]</script>
. Comme c'est comment il devrait être analysée si vous souhaitez changer<script>
pour<b>
. C'est seulement l'HTML 5 spec a changé de</script
. Dans le bon vieux temps, nous avons même utilisé<script><!-- ... //--></script>
(et la magie d'autres incantations) pour être absolument sûr que le contenu d'une balise de script n'a pas été mal interprété.</
, sans avoir à regarder vers l'avenir pourscript
, pourquoi s'embêter./
est plus rapide que de le remplacer, disons,</
? Il aurait au moins de minimiser la taille. Mais en tout cas, c'est du traitement de la question au mauvais niveau (JSON plutôt que de l'endroit où vous êtes en utilisant JSON dans unscript
balise si s'il vous arrive, vous êtes).</
est légèrement plus lent que la recherche de/
parce que vous avez besoin de suivre ce que le caractère précédent a été. Aveuglément remplacement/
est juste plus simple, et c'est ce qui arrive pour tous les caractères réservés trop. En outre, la spécification JSON permet toujours de pas escape/
. Donc, si vous n'aimez pas la météorisation: utilisation/écriture d'un JSON formateur qui n'échappe pas à/
. Personne ne vous force à le faire de toute façon, comme c'est une option de codage de la fonction.</
aussi vite que/
. Mais il n'est pas particulièrement important, c'est encore de la manipulation au mauvais niveau.<script type="text/javascript"><!--//--><![CDATA[//><!--
...//--><!]]></script>
la forme, qui, à l'aide d'une CDATA, s'en échappe (hah!) ce problème ainsi. (Pour les curieux:<style type="text/css"><!--/*--><![CDATA[/*><!--*/
.../*]]>*/--></style>
est l'appariement “bon” escape pour le CSS, et les deux sont aussi XHTML/1.1 laver).La spécification JSON dit, vous POUVEZ échapper à slash, mais vous n'avez pas à.
J'ai demandé à la même question il y a quelques temps et avait à répondre moi-même. Voici ce que j'ai trouvé:
Laid PHP!
La
JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES
doivent être par défaut, pas une (étrange) option... Comment dire à php-développeurs?La par défaut DOIT être la plus fréquente de l'utilisation, et l' (actuel) le plus largement utilisé les normes de l'utf-8. Combien de PHP-fragments de code dans le Github ou autre lieu besoin de cette exoctic "intégré dans le HTML" fonctionnalité?
PHP s'échappe des barres obliques par défaut qui est probablement pourquoi cela semble si souvent. Je ne sais pas pourquoi, mais peut-être parce que l'intégration de la chaîne de
"</script>"
à l'intérieur d'un<script>
tag est considéré comme dangereux.Cette fonctionnalité peut être désactivée en passant dans le
JSON_UNESCAPED_SLASHES
drapeau, mais la plupart des développeurs de ne pas utiliser ce depuis le premier résultat est déjà JSON valide.