C# .NET Core中如何防范Path Manipulation问题?Fortify扫描疑问
在C# .NET Core中防范Path Manipulation问题的方案
绝对不能忽略Fortify的扫描结果,Path Manipulation(路径操纵)是高危安全漏洞——攻击者可通过构造恶意路径(比如利用../进行目录遍历),访问或篡改系统中未授权的文件,因此必须针对性修复。
核心修复原则
所有文件操作的路径必须经过严格校验和规范化,确保最终路径落在预期的安全目录范围内。
1. 限制路径到安全根目录(白名单机制)
定义允许操作的固定根目录,将用户输入的路径转换为该根目录下的相对路径,合并后校验最终路径是否在安全目录内。
示例代码:
// 定义安全根目录,比如应用内的专属文件存储目录 string safeRootPath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "AuthorizedFiles")); // 假设userInputPath是外部传入的路径参数 string userInputPath = "user_docs/report.pdf"; // 合并并规范化路径,避免相对路径遍历 string fullPath = Path.GetFullPath(Path.Combine(safeRootPath, userInputPath)); // 校验最终路径是否在安全根目录范围内 if (!fullPath.StartsWith(safeRootPath, StringComparison.OrdinalIgnoreCase)) { throw new SecurityException("非法路径,禁止访问"); } // 校验通过后再执行文件操作 if (File.Exists(fullPath)) { // 业务逻辑处理 }
2. 过滤非法路径内容
移除或拒绝包含目录遍历序列、绝对路径前缀、非法字符的输入,同时禁止使用操作系统保留的文件名。
示例代码:
string SanitizeInputPath(string inputPath) { // 移除目录遍历序列 string sanitized = inputPath.Replace("../", "").Replace("..\\", "") .Replace("./", "").Replace(".\\", ""); // 禁止使用绝对路径 if (Path.IsPathRooted(sanitized)) { throw new ArgumentException("不允许传入绝对路径"); } // 过滤文件名中的非法字符 char[] invalidChars = Path.GetInvalidFileNameChars(); if (sanitized.IndexOfAny(invalidChars) != -1) { throw new ArgumentException("路径包含非法字符"); } // 禁止使用系统保留文件名(如con、nul等) string fileName = Path.GetFileName(sanitized); var reservedNames = new[] { "con", "nul", "prn", "aux" }; if (reservedNames.Contains(fileName, StringComparer.OrdinalIgnoreCase)) { throw new ArgumentException("禁止使用系统保留文件名"); } return sanitized; }
3. 遵循最小权限原则
运行应用的进程仅授予必要的文件系统权限——比如只允许读写指定的安全目录,即使路径校验被绕过,也能最大程度降低攻击危害。
4. 避免直接拼接路径字符串
优先使用Path.Combine()方法拼接路径,该方法会自动处理不同操作系统的路径分隔符,减少因手动拼接导致的路径漏洞。
总结
通过安全目录白名单校验、路径内容清洗、最小权限配置这几个核心手段,就能有效修复Fortify扫描出的Path Manipulation问题,彻底规避路径操纵带来的安全风险。
内容的提问来源于stack exchange,提问作者Özlem Kozan
相关产品推荐
相关产品推荐

