JSON: ¿por qué se escapan las barras hacia adelante?


La razón de esto "se me escapa".

JSON escapa a la barra diagonal, por lo que un hash {a: "a/b/c"} se serializa como {"a":"a\/b\/c"} en lugar de {"a":"a/b/c"}.

¿Por qué?

Author: Jason S, 2009-10-17

6 answers

JSON no requiere que hagas eso, te permite hacerlo. También le permite usar "\u0061 "para " A", pero no es necesario. Permitir \/ ayuda al incrustar JSON en una etiqueta <script>, que no permite </ dentro de cadenas, como señala Seb.

Algunos de los ASP.NET Las API de Ajax/JSON usan esta laguna para agregar información adicional, por ejemplo, una fecha y hora se enviará como "\/Date(milliseconds)\/". (Yuck)

 246
Author: Ruben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-16 22:04:42

La especificación JSON dice que PUEDE escapar de la barra diagonal, pero no tiene que hacerlo.

 27
Author: Harold L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-16 21:59:14

Hice la misma pregunta hace algún tiempo y tuve que responderla yo mismo. Esto es lo que se me ocurrió:

Parece, mi primer pensamiento [que proviene de su JavaScript raíces] era correcto.

'\/' === '/' en JavaScript, y JSON es JavaScript válido. Obstante, ¿por qué los otros escapes ignorados (como \z) no están permitidos en JSON?

La clave para esto era leer http://www.cs.tut.fi / ~jkorpela/www/revsol.html , seguido de http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2. La característica de el escape de barra diagonal permite que JSON se incruste en HTML (como SGML) y XML.

 14
Author: Boldewyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:43

Ugly PHP!

El JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES debe ser predeterminado, no una opción (extraña)... ¿Cómo decirlo a los desarrolladores de php?

El predeterminado DEBE ser el uso más frecuente, y los estándares (actuales) más utilizados como UTF8. ¿Cuántos fragmentos de código PHP en el Github u otro lugar necesitan esta característica exoctica "incrustada en HTML"?

 6
Author: Peter Krauss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 19:21:55

PHP escapa de las barras inclinadas hacia adelante por defecto que es probablemente la razón por la que esto aparece tan comúnmente. No estoy seguro de por qué, pero posiblemente porque incrustar la cadena "</script>" dentro de una etiqueta <script> se considera inseguro.

Esta funcionalidad se puede desactivar pasando el indicador JSON_UNESCAPED_SLASHES, pero la mayoría de los desarrolladores no lo usarán ya que el resultado original ya es un JSON válido.

 2
Author: Simon East,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-22 02:30:15

Dado que JSON es por definición javascript, y en javascript por definición una sola barra invertida no puede estar presente en una cadena sin ser parte de un símbolo codificado especial (como newline), entonces es perfectamente lógico agregar un símbolo codificado especial adicional para una barra diagonal, porque esto facilita la tarea de prevenir ataques XSS TANTO que incluso podría agradecer a ese hombre genial que logró lograrlo con la inclusión de este (aparentemente) controversial hack en la especificación JSON. También podrían agregar los mismos símbolos especiales para los corchetes angulares, pero parece que no es necesario hacerlo porque con la barra diagonal neutralizada no es más hostil y pueden lanzar tantos corchetes angulares al código como quieran, simplemente no permitirá que ningún XSS loco tenga éxito.

 -6
Author: asdfasdfads,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-15 13:37:38