javascript - parse - JSON: ¿Por qué se escapan barras diagonales hacia adelante?
leer json externo con javascript (6)
PHP feo!
El JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES
debe ser predeterminado, no una opción (extraña) ... ¿Cómo decírselo a los desarrolladores de php?
El valor 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 Github u otro lugar necesitan esta característica exoctica "incrustada en HTML"?
La razón de esto me "escapa".
JSON escapa de la barra diagonal, por lo que un hash {a: "a/b/c"}
se serializa como {"a":"a//b//c"}
lugar de {"a":"a/b/c"}
.
¿Por qué?
Hace un tiempo hice la misma pregunta y tuve que responderla yo mismo. Esto es lo que se me ocurrió:
Parece que mi primer pensamiento [ que viene de sus raíces de JavaScript ] fue correcto.
''//'' === ''/''
en JavaScript, y JSON es un JavaScript válido. Sin embargo, ¿por qué los otros escapes ignorados (como/z
) no están permitidos en JSON?La clave para esto fue 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 slash escape permite que JSON se incruste en HTML (como SGML) y XML.
JSON no requiere que hagas eso, te permite hacerlo. También le permite usar "/ u0061" para "A", pero no es obligatorio. Permitir //
ayuda cuando se incrusta JSON en una etiqueta <script>
, que no permite </
inside strings, como señala Seb.
Algunas de las API de Ajax / JSON de ASP.NET de Microsoft usan esta laguna para agregar información adicional, por ejemplo, una fecha y hora se enviará como "//Date(milliseconds)//"
. (Asco)
La especificación JSON dice que PUEDES escapar de la barra diagonal, pero no tienes que hacerlo.
Ya 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 nueva línea), entonces es perfectamente lógico agregar un símbolo codificado especial adicional para una barra inclinada hacia adelante , porque esto facilita la tarea de prevenir ataques XSS TANTO que incluso podría agradecerle a ese hombre genio que logró llevarlo a cabo al incluir este (aparentemente) controversial pirateo en la especificación JSON. También podrían agregar los mismos símbolos especiales para los corchetes angulares, pero no parece necesario hacerlo porque con la barra diagonal neutralizada no es más hostil y pueden lanzar tantos corchetes angulares en el código como deseen, simplemente ganarán. No permitas que ningún loco XSS tenga éxito.
PHP escapa las barras diagonales de forma predeterminada, lo que probablemente sea la razón por la que esto aparece con tanta frecuencia. 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 deshabilitar pasando el indicador JSON_UNESCAPED_SLASHES
, pero la mayoría de los desarrolladores no lo utilizarán, ya que el resultado original ya es JSON válido.