flawopen.com/Path Traversal/Node.js path.join()
Apakah Node.js path.join() mencegah Path Traversal?
Tidak. path.join() menormalkan segmen path, tetapi tidak mencegah .. keluar dari direktori yang dimaksud. Resolve kandidat path terhadap direktori dasar, lalu pastikan path relatif tetap berada di dalamnya. Pemeriksaan leksikal ini tidak dengan sendirinya membatasi symlink sistem berkas.
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");
}
Mengapa path.join() saja tidak cukup
path.join() menggabungkan segmen dengan pemisah platform lalu menormalkan hasilnya. Normalisasi tidak menolak .. karena segmen itu valid di banyak path. Menggabungkan ../../etc/passwd dengan direktori dasar tetap dapat menghasilkan path di luar direktori; join() bukan pemeriksaan containment.
Tanya jawab
path.normalize() menyelesaikan segmen .. dan . dalam string, tetapi tidak memastikan hasilnya tetap di dalam direktori dasar yang diizinkan. Bandingkan path.relative(base, resolved) dan tolak hasil kosong jika file diwajibkan, .., awalan .. diikuti path.sep, atau hasil relatif absolut.
Tidak. path.resolve() dan path.relative() membandingkan string path, bukan mengikuti symlink sistem berkas. Jika penyerang dapat membuat atau mengganti symlink di bawah direktori dasar, validasi target filesystem yang sebenarnya dan gunakan pola akses yang mencegah race antara pemeriksaan dan penggunaan. Batasi izin tulis pada pohon direktori jika memungkinkan.