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?
É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:
JSON.parse()
peut lever une exception.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;
}
}
Ç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.