C++实现路径合法性校验:检查文件是否在当前目录或子目录
安全校验HTTP请求路径的高效方案(C++)
不用再用directory_iterator遍历目录了,直接利用C++17的std::filesystem库提供的规范化和子目录检查方法,高效又可靠,核心思路是将请求路径规范化后,验证其是否处于静态文件根目录的范围内。
实现步骤
提前缓存静态根目录的绝对路径
把静态文件服务的根目录转换为绝对路径并缓存,避免每次请求都重复计算,提升效率:#include <filesystem> namespace fs = std::filesystem; // 初始化时确定静态文件根目录,比如当前目录下的static文件夹 const fs::path static_root = fs::absolute("./static");校验请求路径的安全性
对用户请求的路径做规范化处理,自动解析..、.等相对路径,然后直接检查是否属于根目录的子路径: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
相关产品推荐
相关产品推荐

