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

C++实现路径合法性校验:检查文件是否在当前目录或子目录

安全校验HTTP请求路径的高效方案(C++)

不用再用directory_iterator遍历目录了,直接利用C++17的std::filesystem库提供的规范化和子目录检查方法,高效又可靠,核心思路是将请求路径规范化后,验证其是否处于静态文件根目录的范围内。

实现步骤

  1. 提前缓存静态根目录的绝对路径
    把静态文件服务的根目录转换为绝对路径并缓存,避免每次请求都重复计算,提升效率:

    #include <filesystem>
    namespace fs = std::filesystem;
    
    // 初始化时确定静态文件根目录,比如当前目录下的static文件夹
    const fs::path static_root = fs::absolute("./static");
    
  2. 校验请求路径的安全性
    对用户请求的路径做规范化处理,自动解析..、.等相对路径,然后直接检查是否属于根目录的子路径:

    bool is_request_path_safe(const std::string& request_path_str) {
        try {
            fs::path request_path(request_path_str);
            // 拼接根目录和请求路径,然后规范化(自动处理../、./等)
            fs::path full_path = fs::weakly_canonical(static_root / request_path);
            
            // 检查规范化后的路径是否是静态根目录的子目录
            return fs::is_subdirectory(full_path, static_root);
        } catch (const fs::filesystem_error& e) {
            // 路径解析出错(比如包含非法字符、超出系统路径长度限制),直接判定为不安全
            return false;
        }
    }
    

关键细节说明

  • 为什么用weakly_canonical?
    它比canonical更适合HTTP场景:canonical要求路径必须存在,但用户请求的静态文件可能不存在,这时候我们依然需要先校验路径合法性,weakly_canonical可以处理不存在的路径,同时正确解析相对路径和符号链接。
  • 绝对路径的必要性
    必须用绝对路径做对比,避免相对目录带来的歧义(比如当前工作目录变化导致的判断错误)。
  • 异常处理
    捕获文件系统异常,防止恶意构造的非法路径导致程序崩溃。

内容的提问来源于stack exchange,提问作者bsdsylvia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:01:39