UNPKG

directory-traversal-js

Version:

protect file upload & filenames with directory traversal

28 lines (24 loc) 1.1 kB
import * as path from 'path'; function startsWith(txt: string, search: string, rawPos?: number) { const pos: number = rawPos > 0 ? rawPos|0 : 0; return txt.substring(pos, pos + search.length) === search; } function commonPrefix(paths: string[]): string { const arr: string[] = paths.concat().sort(); const startElement: string = arr[0]; const endElement: string = arr[arr.length - 1]; const L: number = startElement.length; let i: number = 0; while (i < L && startElement.charAt(i) === endElement.charAt(i)) i++; return startElement.substring(0, i); }; export function safeJoin(rootFolder: string, filename: string): string { rootFolder = path.join(path.normalize(rootFolder), ''); const normalizedFullPath: string = path.normalize(path.join(rootFolder, filename)); const commonPathPrefix: string = commonPrefix([normalizedFullPath, rootFolder]); if (!commonPathPrefix || !startsWith(commonPathPrefix, rootFolder)) { throw new Error("Requested filename is outside of root directory!"); } return normalizedFullPath; };