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

使用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. 强制限制路径到指定安全根目录

这是最可靠的方案——不管输入是什么,最终生成的路径必须落在你预先定义的安全目录下。步骤如下:

  1. 定义固定的安全根目录(比如你的UI资源存放目录)
  2. 组合路径后获取完整绝对路径
  3. 验证该路径是否是安全根目录的子目录
  4. 不符合则拒绝或使用默认资源

示例代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:58:14