You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:53:26