flawopen.com/Analyse JSON/JSON.parse() vs eval()
JSON.parse() est-il plus sûr que eval() ?
Imaginez que l’entrée soit une note : JSON.parse() lit les champs d’un formulaire structuré, tandis que eval() remet la note à un interpréteur comme des instructions à exécuter. JSON.parse() suit la grammaire JSON et n’exécute pas le JavaScript du texte ; les valeurs obtenues doivent néanmoins être validées avant usage.
// Ne traitez pas des données non fiables comme du code source.
const data = eval("(" + untrustedJson + ")");
const data = JSON.parse(untrustedJson);
// Analyse JSON comme des données ; un JSON invalide lève SyntaxError.
Pourquoi cette question se pose
Avant que JSON.parse() soit largement disponible, certains codes JavaScript utilisaient eval() pour lire du JSON, car le texte JSON recoupe la syntaxe des expressions JavaScript. Cette méthode évalue un programme JavaScript : une entrée contrôlée par un attaquant peut donc être interprétée comme du code au lieu d’être limitée aux valeurs JSON. Utilisez le parseur JSON pour lire du JSON.
Ce que JSON.parse() ne protège pas
JSON.parse() ne valide pas les règles métier, n’autorise pas les actions et ne rend pas les valeurs analysées sûres pour HTML, SQL, les commandes shell ou les URL. Validez la structure attendue et utilisez un encodage de sortie adapté au contexte ou des API paramétrées. Si vous fournissez un reviver, ce callback de l’application s’exécute pendant l’analyse ; gardez-le fiable, simple et sans effet secondaire fondé sur des valeurs contrôlées par un attaquant.
Questions fréquentes
Le texte JSON lui-même est analysé comme des données, pas exécuté comme du JavaScript. Toutefois, si l’application fournit un reviver, ce callback de confiance est appelé pour les valeurs analysées et peut exécuter du code. Ne laissez pas des données contrôlées par un attaquant choisir ou construire la logique exécutable du callback.
Non. Vérifiez la valeur analysée par rapport au schéma attendu par l’application et aux règles d’autorisation. Utilisez l’encodage de sortie pour HTML et les requêtes paramétrées pour SQL ; l’analyse ne nettoie pas les données pour ces contextes.