flawopen.com/Path Traversal/Node.js path.join()
क्या Node.js path.join() Path Traversal रोकता है?
नहीं। path.join() path segments को normalize करता है, लेकिन .. को तय directory से बाहर जाने से नहीं रोकता। candidate path को base directory के सापेक्ष resolve करें और पुष्टि करें कि relative path उसी के भीतर रहे। यह lexical जाँच filesystem symlinks को अपने आप सीमित नहीं करती।
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");
}
केवल path.join() पर्याप्त क्यों नहीं
path.join() platform separator से segments जोड़ता और परिणाम normalize करता है। यह .. को अस्वीकार नहीं करता, क्योंकि कई paths में यह वैध है। ../../etc/passwd को base से जोड़ने पर भी बाहर का path मिल सकता है; join() containment नहीं जाँचता।
अक्सर पूछे जाने वाले प्रश्न
path.normalize() string में .. और . segments सुलझाता है, लेकिन यह नहीं जाँचता कि परिणाम अनुमत base के भीतर है। path.relative(base, resolved) की तुलना करें और file आवश्यक होने पर खाली परिणाम अस्वीकार करें; .., .. के बाद path.sep वाला prefix और absolute relative result भी अस्वीकार करें।
नहीं। path.resolve() और path.relative() path strings की तुलना करते हैं; वे filesystem symlinks का अनुसरण नहीं करते। यदि हमलावर base के भीतर symlink बना या बदल सकता है, तो वास्तविक लक्ष्य validate करें और जाँच व उपयोग के बीच race रोकने वाला access तरीका अपनाएँ। संभव हो तो tree पर write access सीमित करें।