使用Path.Combine遇路径遍历警告,求NewtonJSON加载数据的漏洞修复方案
解决Path.Combine路径遍历警告的方案
我之前在处理外部配置文件加载资源时也踩过这个坑,结合你用NewtonJSON加载UI数据的场景,分享几个实用的解决办法,从根源上消除路径遍历的风险:
1. 严格验证并清理输入路径片段
从JSON加载的路径完全不可信,第一步要做的就是过滤掉所有可能导致路径遍历的内容:
- 拒绝包含路径分隔符(
/、\)的输入,只保留纯文件名(比如用Path.GetFileName()提取文件名部分) - 检查输入是否为绝对路径(用
Path.IsPathRooted()),如果是直接丢弃或使用默认资源 - 手动过滤
../、./这类遍历关键字(不过更推荐下面的目录限制方法,因为字符过滤可能有绕过情况)
示例代码:
string uiResourcePath = jsonData.UiResourcePath; // 从NewtonJSON加载的路径 // 只保留文件名,自动去掉路径层级 string cleanFileName = Path.GetFileName(uiResourcePath); // 如果清理后为空,使用默认资源 if (string.IsNullOrEmpty(cleanFileName)) { cleanFileName = "default_ui_element.png"; } // 再和安全根目录组合 string safePath = Path.Combine(@"C:\MyApp\SafeUiResources", cleanFileName);
2. 强制限制路径到指定安全根目录
这是最可靠的方案——不管输入是什么,最终生成的路径必须落在你预先定义的安全目录下。步骤如下:
- 定义固定的安全根目录(比如你的UI资源存放目录)
- 组合路径后获取完整绝对路径
- 验证该路径是否是安全根目录的子目录
- 不符合则拒绝或使用默认资源
示例代码:
string safeRoot = Path.GetFullPath(@"C:\MyApp\ApprovedUiAssets"); string userInputPath = jsonData.UiResourcePath; // 先组合路径(这里即使输入有../,后续会验证) string combinedPath = Path.Combine(safeRoot, userInputPath); string fullCombinedPath = Path.GetFullPath(combinedPath); // 验证是否在安全根目录内(注意用OrdinalIgnoreCase适配Windows大小写不敏感) if (!fullCombinedPath.StartsWith(safeRoot, StringComparison.OrdinalIgnoreCase)) { // 非法路径,触发错误处理 throw new SecurityException("Invalid UI resource path detected!"); // 或者使用默认资源: // fullCombinedPath = Path.Combine(safeRoot, "default_asset.png"); }
3. 规范JSON数据格式,只允许文件名而非路径
从源头避免问题:要求JSON里只存储UI资源的文件名,不允许包含任何路径层级。比如JSON里只存"button_blue.png",而不是"../assets/buttons/button_blue.png"。这样组合路径时直接和根目录拼接,完全不会有遍历风险。
关键提醒
- 不要只依赖字符过滤:攻击者可能用编码后的遍历字符(比如Unicode的特殊分隔符)绕过简单的字符串检查,目录范围验证才是最稳妥的
- 永远不要信任外部输入:即使是自己生成的JSON文件,也要做验证——万一文件被篡改呢?
内容的提问来源于stack exchange,提问作者Terence
相关产品推荐
相关产品推荐

