Ho una webapp node.js nella quale ho bisogno di concatenare due percorsi in modo sicuro. Il primo (a sinistra) è una costante e il secondo (a destra) è relativo al primo e proviene da input dell'utente non attendibile. Il percorso risultante dovrebbe essere qualcosa che si trova sotto il primo percorso. Quindi la situazione è questa:
path1 = "public/html"; // Hardcoded path.
path2 = req.query.path; // Untrusted user input.
result = safePathJoin(path1, path2); // Result can be e.g. public/html/index.htm,
// but never private/config.xml
Ciò di cui ho bisogno è la funzione safePathJoin()
che è sicura contro gli attacchi traversali di directory. Il mio primo approccio ingenuo è questo:
safePathJoin = function(path1, path2) {
path1 = path.normalize(path1);
var result = path.join(path1, path2);
return result.startsWith(path1) ? result : undefined;
}
È abbastanza buono? C'è un modo standard per farlo? Qualche suggerimento?