Optional
危险内容替换回调(安全防线)
在 purge 阶段最先执行。默认不传则不做任何安全检查—— 这意味着 join('/var/www', '../../../etc') 会返回 ../etc。
purge
join('/var/www', '../../../etc')
../etc
调用时机:join(...paths) 中,每个顶层 path 参数调用一次 purge, 即 dangerReplace 每个参数只执行一次。若传入含分隔符的参数(如 join(`${prefix}/a/b`)),回调看到的是完整的 "prefix/a/b" 字符串; join 在内部 split 后得到的子段不会再次触发 dangerReplace。
join(...paths)
path
dangerReplace
join(`${prefix}/a/b`)
"prefix/a/b"
join
强烈建议在此回调中实现路径遍历拦截,例如:
..
dangerReplace: (path, sep) => { // 拒绝绝对路径 if (path.startsWith(sep)) throw new Error('absolute path not allowed'); // 移除所有 .. 段 return path.split(sep).filter(s => s !== '..').join(sep);} Copy
dangerReplace: (path, sep) => { // 拒绝绝对路径 if (path.startsWith(sep)) throw new Error('absolute path not allowed'); // 移除所有 .. 段 return path.split(sep).filter(s => s !== '..').join(sep);}
重复分隔符合并回调
在 dangerReplace 之后执行。默认不传则不做合并处理。 典型用途://a//b → /a/b。
//a//b
/a/b
危险内容替换回调(安全防线)
在
purge阶段最先执行。默认不传则不做任何安全检查—— 这意味着join('/var/www', '../../../etc')会返回../etc。调用时机:
join(...paths)中,每个顶层path参数调用一次purge, 即dangerReplace每个参数只执行一次。若传入含分隔符的参数(如join(`${prefix}/a/b`)),回调看到的是完整的"prefix/a/b"字符串;join在内部 split 后得到的子段不会再次触发dangerReplace。强烈建议在此回调中实现路径遍历拦截,例如:
..段