如何修复C#中的Cleansing_Canonicalization_and_Comparison_Errors Checkmarx漏洞?附代码示例求助
修复C#中的Checkmarx Cleansing_Canonicalization_and_Comparison_Errors漏洞
首先得搞清楚这个告警到底是什么意思:Checkmarx触发这个漏洞,是因为你直接把**用户可控的输入(这里是DownloadFileCtrl.Value)**和服务器路径拼接,既没有对输入做规范化处理,也没有验证输入的合法性——这就给了攻击者机会,比如通过输入../../some-malicious-file.txt这类路径遍历内容,访问或删除服务器上不在预期目录里的文件。
针对你代码里的问题,我们可以通过以下几步来修复:
1. 永远不要直接用字符串拼接路径,改用Path.Combine
字符串拼接路径很容易出现分隔符问题,而且无法自动处理非法路径结构。Path.Combine会帮你正确处理不同系统的路径分隔符,还能在一定程度上规避路径遍历风险(但光靠它还不够)。
2. 对用户输入做严格的合法性校验
用户输入的应该只能是单纯的文件名,不能包含路径分隔符(/、\)或者路径遍历符号(..)。我们可以用Path.GetFileName提取输入中的文件名部分,或者直接检查输入是否包含非法字符。
3. 验证最终路径是否在允许的目录范围内
即使做了前面两步,最好再确认最终生成的文件路径确实在你指定的appPath目录下,防止出现绕过校验的情况。
修改后的代码示例
string appPath = ConfigurationManager.AppSettings["ServerPath"].ToString(); try { // 第一步:提取合法的文件名,过滤掉路径部分 string fileName = Path.GetFileName(DownloadFileCtrl.Value); if (string.IsNullOrEmpty(fileName)) { // 处理非法输入的情况,比如返回错误提示 throw new ArgumentException("Invalid file name provided."); } // 第二步:用Path.Combine拼接合法路径 string fullFilePath = Path.Combine(appPath, fileName); // 第三步:验证最终路径是否在允许的目录内 string normalizedAppPath = Path.GetFullPath(appPath); string normalizedFullPath = Path.GetFullPath(fullFilePath); if (!normalizedFullPath.StartsWith(normalizedAppPath, StringComparison.OrdinalIgnoreCase)) { // 路径超出允许范围,拒绝操作 throw new SecurityException("Attempted access to unauthorized file path."); } // 现在执行安全的文件操作 FileLoader.FileDownLoad(fullFilePath); FileLoader.DeleteFile(fullFilePath); } catch (Exception ex) { // 这里可以添加错误日志和友好提示 // Log.Error(ex, "File operation failed"); }
关键修复点解释:
Path.GetFileName(DownloadFileCtrl.Value):会自动去掉输入中的路径部分,只保留文件名,比如输入../../file.txt会被处理成file.txt。Path.Combine(appPath, fileName):安全拼接路径,避免手动拼接的错误。- 路径规范化与校验:用
Path.GetFullPath把两个路径都转换成绝对路径,然后检查最终路径是否以允许的目录开头,彻底防止路径遍历攻击。
这样修改后,Checkmarx的告警应该就会消失,同时你的代码也变得更安全,能抵御路径遍历类的攻击。
内容的提问来源于stack exchange,提问作者Shikha Singh
相关产品推荐
相关产品推荐

