flawopen.com/Path Traversal/Node.js path.join()
Node.js path.join() empêche-t-il Path Traversal ?
Non. path.join() normalise les segments, mais n’empêche pas .. de sortir du répertoire prévu. Résolvez le chemin candidat par rapport à la base, puis vérifiez que le chemin relatif reste dedans. Cette vérification lexicale ne protège pas contre les liens symboliques du système de fichiers.
const filePath = path.join( BASE_DIR, userFilename ); // userFilename = "../../etc/passwd" // still escapes BASE_DIR
const base = path.resolve(BASE_DIR);
const resolved = path.resolve(base, userFilename);
const relative = path.relative(base, resolved);
if (
relative === '' ||
relative === '..' ||
relative.startsWith('..' + path.sep) ||
path.isAbsolute(relative)
) {
throw new Error("Invalid path");
}
Pourquoi path.join() ne suffit pas
path.join() combine les segments avec le séparateur de la plateforme et normalise le résultat. La normalisation ne rejette pas .., valide dans de nombreux chemins. Joindre ../../etc/passwd à une base peut toujours produire un chemin extérieur ; join() ne vérifie pas la contenance.
FAQ
path.normalize() résout les segments .. et . dans la chaîne, mais ne vérifie pas que le résultat reste dans une base autorisée. Comparez path.relative(base, resolved) et rejetez un résultat vide si un fichier est requis, .., un préfixe .. suivi de path.sep ou un résultat relatif absolu.
Non. path.resolve() et path.relative() comparent des chaînes ; ils ne suivent pas les liens symboliques du système de fichiers. Si un attaquant peut créer ou remplacer des liens sous la base, vérifiez la cible réelle et utilisez des accès qui empêchent une course entre vérification et utilisation. Limitez les droits d’écriture sur l’arborescence si possible.