FlawOpen

flawopen.com/Analyse JSON/JSON.parse() vs eval()

JSON.parse() est-il plus sûr que eval() ?

Guide de référence
Réponse courte

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.

DANGEREUX — ancien modèle
// Ne traitez pas des données non fiables comme du code source.
const data = eval("(" + untrustedJson + ")");
SÛR
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

JSON.parse() peut-il exécuter du code de l’application ?

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.

JSON.parse() rend-il les données sûres pour un usage ultérieur ?

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.

Références

À voir aussi Pollution de prototypes JavaScript : causes et correctifs lodash.merge() : risque de pollution de prototypes ? Object.assign() et Prototype Pollution : que risque-t-on ? JSON.parse() provoque-t-il une pollution de prototype ?