
Étant donné un contenu de type JSON, le JSON Sanitizer le convertit en JSON valide.
Étant donné un contenu de type JSON, le JSON Sanitizer le convertit en JSON valide.
Cet outil peut être attaché à chaque extrémité d'un pipeline de données pour aider à satisfaire le principe de Postel :
soyez conservateur dans ce que vous faites, soyez libéral dans ce que vous acceptez des autres
Appliqué à un contenu de type JSON provenant d'autres, il produira un JSON bien formé qui devrait satisfaire tout analyseur que vous utilisez.
Appliqué à votre sortie avant envoi, il corrigera les petites erreurs d'encodage et facilitera l'intégration de votre JSON dans du HTML et du XML.

De nombreuses applications ont de grandes quantités de code qui utilisent des méthodes ad hoc pour générer des sorties JSON.
Fréquemment, ces sorties passent toutes par une petite quantité de code de framework avant d'être envoyées sur le réseau. Cette petite quantité de code de framework peut utiliser cette bibliothèque pour s'assurer que les sorties ad hoc sont conformes aux normes et sûres à passer à des désérialiseurs (trop) puissants comme l'opérateur eval de JavaScript.
Les applications ont aussi souvent des API de services web qui reçoivent du JSON de diverses sources. Lorsque ce JSON est créé avec des méthodes ad hoc, cette bibliothèque peut le transformer en une forme facile à analyser.
En intégrant cette bibliothèque dans le code qui envoie et reçoit les requêtes et réponses, cette bibliothèque peut aider les architectes logiciels à garantir la sécurité et la bonne formation à l'échelle du système.
Le sanitizer prend un contenu de type JSON et l'interprète comme le ferait JS eval. Plus précisément, il traite ces constructions non standard.
| Construct | Policy |
|---|---|
'...' | Les chaînes entre guillemets simples sont converties en chaînes JSON. |
\xAB | Les échappements hexadécimaux sont convertis en échappements Unicode JSON. |
\012 | Les échappements octaux sont convertis en échappements Unicode JSON. |
0xAB | Les littéraux entiers hexadécimaux sont convertis en nombres décimaux JSON. |
012 | Les littéraux entiers octaux sont convertis en nombres décimaux JSON. |
+.5 | Les nombres décimaux sont convertis au format plus strict de JSON. |
[0,,2] | Les élisions dans les tableaux sont remplies avec null. |
[1,2,3,] | Les virgules finales sont supprimées. |
{foo:"bar"} | Les noms de propriétés non cités sont mis entre guillemets. |
//comments | Les commentaires de ligne et de bloc de style JS sont supprimés. |
(...) | Les parenthèses de regroupement sont supprimées. |
Le sanitizer corrige la ponctuation manquante, les guillemets de fin et les crochets fermants manquants ou non appariés. Si une entrée ne contient que des espaces blancs, la chaîne JSON valide null est substituée.
La sortie est du JSON bien formé tel que défini par RFC 4627. La sortie satisfait ces propriétés supplémentaires :
"<script", "</script" ou "<!--" et peut donc être intégrée dans un élément script HTML sans encodage supplémentaire."]]>" et peut donc être intégrée dans une section CDATA XML sans encodage supplémentaire.eval de JavaScript (après avoir été entourée de parenthèses) ou par JSON.parse. Plus précisément, la sortie ne contiendra aucun littéral de chaîne avec des sauts de ligne JS intégrés (séparateur de paragraphe U+2028 ou séparateur de ligne U+2029).Puisque la sortie est du JSON bien formé, la passer à eval n'aura aucun effet de bord et aucune variable libre, donc ce n'est ni un vecteur d'injection de code, ni un vecteur d'exfiltration de secrets.
Cette bibliothèque garantit seulement que la phase de conversion de la chaîne JSON en objet JavaScript n'a pas d'effets de bord et ne résout aucune variable libre, et ne peut pas contrôler comment d'autres codes côté client interprètent ensuite l'objet JavaScript résultant. Donc si un code côté client prend une partie des données analysées qui est contrôlée par un attaquant et la repasse à travers un interpréteur puissant comme eval ou innerHTML, alors ce code côté client pourrait subir des effets de bord involontaires.
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
De plus, l'assainissement du JSON ne peut pas protéger une application des attaques de député confus
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
La méthode sanitize retournera la chaîne d'entrée sans allouer un nouveau tampon lorsque l'entrée est déjà du JSON valide qui satisfait les propriétés ci-dessus. Ainsi, si elle est utilisée sur une entrée généralement bien formée, elle a une surcharge mémoire minimale.
La méthode sanitize prend un temps O(n) où n est la longueur de l'entrée en unités de code UTF-16.