
json-sanitizer avec CVE-2020-13973
Étant donné un contenu de type JSON, le JSON Sanitizer le convertit en JSON valide.
Il peut être branché à l'une ou l'autre 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'autrui, il produira un JSON bien formé qui devrait satisfaire tout analyseur que vous utilisez.
Appliqué à votre sortie avant de l'envoyer, il corrigera les erreurs mineures d'encodage et facilitera l'intégration de votre JSON dans du HTML et du XML.

De nombreuses applications disposent 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 d'infrastructure
avant d'être envoyées sur le réseau. Cette petite quantité de
code d'infrastructure 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 disposent également souvent d'API de services web qui reçoivent du JSON provenant de diverses sources. Lorsque ce JSON est créé à l'aide de méthodes ad hoc, cette bibliothèque peut le transformer en une forme facile à analyser.
En branchant cette bibliothèque sur le code qui envoie et reçoit les requêtes et réponses, elle peut aider les architectes logiciels à garantir la sécurité à l'échelle du système et le caractère bien formé des données.
Le sanitizer prend un contenu de type JSON et l'interprète comme le ferait eval en JS.
Plus précisément, il traite ces constructions non standard.
Le sanitizer corrige la ponctuation manquante, les guillemets de fin et les crochets
manquants ou mal appariés. Si une entrée ne contient que des espaces blancs, alors
la chaîne JSON valide null est substituée.
La sortie est un JSON bien formé tel que défini par RFC 4627. La sortie satisfait ces propriétés supplémentaires :
"</script" 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 un JSON bien formé, la passer à eval n'aura
aucun effet de bord et aucune variable libre ; elle n'est donc ni un vecteur d'injection
de code, ni un vecteur d'exfiltration de secrets.
Cette bibliothèque garantit uniquement que la phase chaîne JSON → objet Javascript
n'a pas d'effets de bord et ne résout aucune variable libre, et ne peut pas
contrôler la façon dont d'autres code côté client interprète ensuite l'objet
Javascript résultant. Ainsi, 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, ce code côté client
pourrait subir des effets de bord involontaires.
var myValue = eval(sanitizedJsonString); // sûr
var myEmbeddedValue = eval(myValue.foo); // potentiellement dangereux
De plus, assainir du JSON ne peut pas protéger une application contre les attaques de député confus
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
La méthode sanitize renverra la chaîne d'entrée sans allouer un nouveau
tampon lorsque l'entrée est déjà un 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 un surcoût mémoire minimal.
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.
| Construction | Politique |
|---|
'...' | 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 terminales sont supprimées. |
{foo:"bar"} | Les noms de propriétés non entre guillemets sont mis entre guillemets. |
//comments | Les commentaires de style JS sur une ligne et en bloc sont supprimés. |
(...) | Les parenthèses de groupement sont supprimées. |