web-dev-qa-db-fra.com

La désinfection JSON est-elle nécessaire?

Je pense que c'est une bonne pratique bien connue sur le Web de se méfier de toute entrée. La phrase

"Toutes les entrées sont mauvaises."

est probablement la citation la plus citée en ce qui concerne la validation des entrées. Maintenant, pour HTML, vous pouvez utiliser des outils tels que DOMPurify pour le nettoyer.

Ma question est la suivante: si j'ai un serveur Node.js exécutant Express et body-parser middleware pour recevoir et analyser JSON, dois-je également exécuter un nettoyage?

Mes pensées (peut-être naïves?) À ce sujet sont que JSON n'est que des données, pas de code, et si quelqu'un envoie un JSON invalide, l'analyseur de corps (qui utilise JSON.parse() en interne) échouera de toute façon, donc je sais que mon l'application recevra un objet JavaScript valide. Tant que je n'exécute pas eval ou n'appelle pas de fonction, ça devrait aller, non?

Suis-je en train de manquer quelque chose?

21
Golo Roden

Étant donné que JSON.parse() n'exécute aucun code dans les données à analyser, il n'est pas vulnérable comme eval(), mais il y a encore des choses que vous devez faire pour protéger l'intégrité de votre serveur et de votre application. tel que:

  1. Appliquez des gestionnaires d'exceptions à l'endroit approprié car JSON.parse() peut lever une exception.
  2. Ne faites pas d'hypothèses sur les données qui s'y trouvent, vous devez explicitement tester les données avant de les utiliser.
  3. Traitez uniquement les propriétés que vous recherchez spécifiquement (en évitant d'autres éléments qui pourraient se trouver dans le JSON).
  4. Validez toutes les données entrantes en tant que valeurs légitimes et acceptables.
  5. Désinfectez la longueur des données (pour éviter les problèmes DOS avec des données trop volumineuses).
  6. Ne placez pas ces données entrantes dans des endroits où elles pourraient être davantage évaluées, comme directement dans le code HTML de la page ou injectées directement dans les instructions SQL sans nettoyage supplémentaire pour vous assurer qu'elles sont sûres pour cet environnement.

Donc, pour répondre directement à votre question, "oui", il y a plus à faire que d'utiliser simplement l'analyseur de corps, bien qu'il s'agisse d'une ligne de front parfaitement fine pour le premier traitement des données. Les étapes suivantes pour ce que vous faites avec les données une fois que vous les avez obtenues de l'analyseur corporel sont importantes dans de nombreux cas et peuvent nécessiter des précautions supplémentaires.


À titre d'exemple, voici une fonction d'analyse qui attend un objet avec des propriétés qui applique certaines de ces vérifications et vous donne un résultat filtré qui ne contient que les propriétés que vous attendiez:

// pass expected list of properties and optional maxLen
// returns obj or null
function safeJSONParse(str, propArray, maxLen) {
    var parsedObj, safeObj = {};
    try {
        if (maxLen && str.length > maxLen) {
            return null;
        } else {
            parsedObj = JSON.parse(str);
            if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) {
                safeObj = parseObj;
            } else {
                // copy only expected properties to the safeObj
                propArray.forEach(function(prop) {
                    if (parsedObj.hasOwnProperty(prop)) {
                        safeObj[prop] = parseObj[prop];
                    }
                });
            }
            return safeObj;
        }
    } catch(e) {
        return null;
    }
}
19
jfriend00

Ça devrait aller. Les premiers utilisateurs de JSON appellent souvent eval () sur la chaîne reçue, ce qui est bien sûr un énorme trou de sécurité. Mais JSON.parse, comme vous le dites, gère la majorité de ces types de contrôles d'intégrité.

Tant que vous vous assurez de ne pas retirer quelque chose d'un objet JSON reçu et de le passer directement dans une requête SQL, par exemple, tout devrait bien se passer.

5
Chris Tavares