¿Dónde puedo encontrar una lista de caracteres de escape necesarios para mi tipo de retorno JSON ajax?

Tengo una acción ASP.NET MVC que devuelve un objeto JSON.

El JSON:

{status: "1", message:"", output:"
User generated text, so can be anything
"}

Actualmente mi HTML lo está rompiendo. Habrá texto generado por el usuario en el campo de salida, así que tengo que asegurarme de escapar de TODAS las cosas que necesitan ser escapadas.

¿Alguien tiene una lista de todas las cosas por las que necesito escapar?

No estoy usando ninguna biblioteca JSON, solo construyendo la cadena yo mismo.

Eche un vistazo a http://json.org/ . Reclama una lista un poco diferente de caracteres escapados de lo que Chris propuso.

 \" \\ \/ \b \f \n \r \t \u four-hex-digits 

Aquí hay una lista de caracteres especiales que puede escapar al crear un literal de cadena para JSON:

 \ b Retroceso (código ASCII 08)
 \ f Alimentación de formulario (código ASCII 0C)
 \ n Nueva línea
 Retorno de carro
 \ t Tab
 \ v Pestaña vertical
 \ 'Apostrophe o comilla simple
 \ "Doble cita
 \\ Carácter de barra invertida

Referencia: literales de cadena

Algunos de estos son más opcionales que otros. Por ejemplo, su cadena debe ser perfectamente válida ya sea que escape del carácter de tabulación o lo deje en una tabulación literal. Sin embargo, seguramente deberías manejar la barra invertida y los caracteres de comillas.

Como se explica en la sección 9 de la especificación oficial de ECMA ( http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ) en JSON, deben escaparse los siguientes caracteres:

  • U+0022 ( " , la comilla)
  • U+005C ( \ , la barra invertida o solidus inverso)
  • U+0000 a U+001F (los caracteres de control ASCII)

Además, para incrustar de manera segura JSON en HTML, también se deben escapar los siguientes caracteres:

  • U+002F ( / )
  • U+0027 ( ' )
  • U+003C ( < )
  • U+003E ( > )
  • U+0026 ( & )
  • U+0085 (Línea siguiente)
  • U+2028 (Separador de línea)
  • U+2029 (separador de párrafo)

Algunos de los caracteres anteriores se pueden escapar con las siguientes secuencias cortas de escape definidas en el estándar:

  • \" representa el carácter de comilla (U + 0022).
  • \\ representa el carácter solidus inverso (U + 005C).
  • \/ representa el carácter solidus (U + 002F).
  • \b representa el carácter de retroceso (U + 0008).
  • \f representa el carácter de alimentación de formulario (U + 000C).
  • \n representa el carácter de alimentación de línea (U + 000A).
  • \r representa el carácter de retorno de carro (U + 000D).
  • \t representa el carácter de tabulación de caracteres (U + 0009).

Los otros caracteres que deben escaparse usarán la notación \uXXXX , que es \u seguida por los cuatro dígitos hexadecimales que codifican el punto de código.

El \uXXXX también se puede usar en lugar de la secuencia de escape corto, o para escapar opcionalmente de cualquier otro personaje del Plano multilingüe básico (BMP).

Inmediatamente, puedo decir que al menos las comillas dobles en las tags HTML serán un problema. Esos son probablemente todo lo que necesita para escapar para que sea JSON válido; simplemente reemplace

 " 

con

 \" 

En cuanto a la salida de texto de entrada de usuario, debe asegurarse de ejecutarlo a través de HttpUtility.HtmlEncode () para evitar los ataques XSS y asegurarse de que no arruine el formato de su página.

De la especificación :

Todos los caracteres se pueden colocar entre las comillas, excepto los caracteres que se deben escapar: comillas (U + 0022), solidus inverso [barra invertida] (U + 005C) y los caracteres de control U + 0000 a U + 001F

El hecho de que, por ejemplo, Bell (U + 0007) no tenga un código de escape de un solo carácter no significa que no necesite escapar de él. Use la secuencia de escape Unicode \u0007 .

Los estados de referencia JSON:

  cualquier-carácter-Unicode-
      excepto - "- o - \\ - or-
      personaje de control

Luego enumera los códigos de escape estándar:

   \ "Cita estándar JSON
   \\ Backslash (Escape char)
   \/ Barra inclinada
   \ b Retroceso (código ascii 08)
   \ f Feed de formulario (código ascii 0C)
   \ n Newline
   Retorno de carro
   \ t Pestaña Horizontal
   \ u cuatro-hex-dígitos

De esto asumí que necesitaba escapar de todos los listados y todos los demás son opcionales. Puede elegir codificar todos los caracteres en \uXXXX si así lo desea, o solo podría hacer cualquier carácter ASCII de 7 bits no imprimible o caracteres con valor Unicode que no esté en el \u0020 < = x <= \u007E (32 - 126) Preferentemente, los caracteres estándar primero para códigos de escape más cortos y, por lo tanto, mejor legibilidad y rendimiento.

Además, puede leer el punto 2.5 (Cadenas) de RFC 4627 .

Puede (o no) querer (más) escapar de otros caracteres dependiendo de dónde incruste esa cadena JSON, pero eso está fuera del scope de esta pregunta.