如何修复Gitlab报告中的路径遍历(Path Traversal)安全漏洞?
如何规避路径遍历(Path Traversal)漏洞?
你碰到的是**路径遍历(CWE-22)**漏洞,当前代码直接对IMPORTED_DOCUMENTATION_URL解码后就传给window.open,完全没做路径限制,攻击者很容易构造恶意路径来访问系统内的任意资源。
以下是具体的规避方案:
限制访问范围:用白名单/基础目录锁定合法资源
先明确哪些路径或域名是允许访问的——比如你的文档只在/docs/目录下,或者只能打开指定域名的外部链接。
如果是本地文件路径,检查解码后的路径是否落在允许的基础目录内:const allowedBaseDir = '/docs/'; const rawPath = decodeURIComponent(IMPORTED_DOCUMENTATION_URL); const resolvedPath = path.resolve(rawPath); if (resolvedPath.startsWith(path.resolve(allowedBaseDir))) { window.open(resolvedPath, "_blank", "noopener"); } else { console.error("非法路径:拒绝访问"); }如果是外部链接,强制限制在信任的域名列表里:
const allowedDomains = ['your-docs-domain.com', 'trusted-docs.com']; const rawUrl = decodeURIComponent(IMPORTED_DOCUMENTATION_URL); try { const url = new URL(rawUrl); if (allowedDomains.includes(url.hostname)) { window.open(rawUrl, "_blank", "noopener"); } else { console.error("未授权域名:拒绝访问"); } } catch (e) { console.error("无效URL:拒绝访问"); }严格清理路径中的恶意片段
别只靠decodeURIComponent,要主动过滤掉路径里的遍历字符(比如../、./)和非法字符:function sanitizePath(path) { // 移除路径遍历相关片段、开头斜杠和非法字符 return path.replace(/(\.\.\/|\.\.)/g, '') .replace(/^\/+/, '') .replace(/[\\/:*?"<>|]/g, ''); } const rawPath = decodeURIComponent(IMPORTED_DOCUMENTATION_URL); const safePath = sanitizePath(rawPath); // 再结合基础目录拼接,确保路径合法 const allowedPath = path.join('/docs/', safePath); window.open(allowedPath, "_blank", "noopener");尽量避免直接用用户可控变量当路径/URL
能硬编码合法路径就硬编码,非得用用户输入时,必须经过白名单校验+路径清理的双重验证,绝对不能直接把解码后的用户输入传给window.open或文件系统调用。
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

