
json-sanitizer con CVE-2020-13973
Dado contenido similar a JSON, el JSON Sanitizer lo convierte en JSON válido.
Se puede conectar en cualquiera de los extremos de una canalización de datos para ayudar a satisfacer el principio de Postel:
sé conservador en lo que haces, sé liberal en lo que aceptas de los demás
Aplicado a contenido similar a JSON procedente de otros, producirá JSON bien formado que debería satisfacer a cualquier analizador que utilices.
Aplicado a tu salida antes de enviarla, corregirá pequeños errores de codificación y facilitará la incrustación de tu JSON en HTML y XML.

Muchas aplicaciones tienen grandes cantidades de código que utilizan métodos ad hoc para generar salidas JSON.
Con frecuencia, todas estas salidas pasan a través de una pequeña cantidad de código de framework antes de ser enviadas por la red. Esta pequeña cantidad de código de framework puede usar esta biblioteca para asegurarse de que las salidas ad hoc cumplan los estándares y sean seguras para pasarlas a deserializadores (demasiado) potentes como el operador eval de Javascript.
Las aplicaciones también suelen tener API de servicios web que reciben JSON de una variedad de fuentes. Cuando este JSON se crea mediante métodos ad hoc, esta biblioteca puede transformarlo en una forma fácil de analizar.
Al integrar esta biblioteca en el código que envía y recibe peticiones y respuestas, puede ayudar a los arquitectos de software a garantizar la seguridad a nivel de sistema y el buen formado de los datos.
El sanitizador toma contenido similar a JSON y lo interpreta como lo haría eval de JS. Concretamente, trata estas construcciones no estándar.
El sanitizador corrige la puntuación ausente, las comillas de cierre y los delimitadores de cierre no coincidentes o ausentes. Si una entrada contiene solo espacios en blanco, se sustituye la cadena JSON válida null.
La salida es JSON bien formado según RFC 4627. La salida cumple además estas propiedades adicionales:
"</script", por lo que puede incrustarse dentro de un elemento script HTML sin necesidad de codificación adicional."]]>", por lo que puede incrustarse dentro de una sección CDATA XML sin necesidad de codificación adicional.eval incorporado de Javascript (después de envolverla entre paréntesis) o por JSON.parse. En concreto, la salida no contendrá literales de cadena con nuevas líneas JS incrustadas (separador de párrafo U+2028 o separador de línea U+2029).Dado que la salida es JSON bien formado, pasarla a eval no tendrá efectos secundarios ni variables libres, por lo que no es ni un vector de inyección de código ni un vector para la exfiltración de secretos.
Esta biblioteca solo garantiza que la fase de cadena JSON → objeto Javascript no tenga efectos secundarios ni resuelva variables libres, y no puede controlar cómo otro código del lado del cliente interprete posteriormente el objeto Javascript resultante. Así que si el código del lado del cliente toma una parte de los datos analizados que está controlada por un atacante y la pasa de nuevo a través de un intérprete potente como eval o innerHTML, ese código del lado del cliente podría sufrir efectos secundarios no deseados.
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
Además, sanitizar JSON no puede proteger una aplicación de los ataques de diputado confundido
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
El método sanitize devolverá la cadena de entrada sin asignar un nuevo buffer cuando la entrada ya sea JSON válido que cumpla las propiedades anteriores. Por lo tanto, si se usa con entradas que suelen estar bien formadas, tiene una sobrecarga de memoria mínima.
El método sanitize tarda O(n) tiempo, donde n es la longitud de la entrada en unidades de código UTF-16.
| Construct | Policy |
|---|
'...' | Las cadenas entre comillas simples se convierten en cadenas JSON. |
\xAB | Los escapes hexadecimales se convierten en escapes Unicode JSON. |
\012 | Los escapes octales se convierten en escapes Unicode JSON. |
0xAB | Los literales de enteros hexadecimales se convierten en números decimales JSON. |
012 | Los literales de enteros octales se convierten en números decimales JSON. |
+.5 | Los números decimales se ajustan al formato más estricto de JSON. |
[0,,2] | Las elisiones en los arrays se rellenan con null. |
[1,2,3,] | Las comas finales se eliminan. |
{foo:"bar"} | Los nombres de propiedad sin comillas se entrecomillan. |
//comments | Los comentarios de línea y de bloque estilo JS se eliminan. |
(...) | Los paréntesis de agrupación se eliminan. |