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

C#日志输出未正确中性化(Veracode检测CWE-117)求解决

解决CWE-117日志输出未正确中性化问题

你当前的代码仅替换了换行(\n)和回车(\r),但这不足以覆盖所有可能引发日志注入、格式混乱的字符,比如制表符、垂直制表符、JSON特殊符号等,这就是Veracode检测出CWE-117的核心原因。

修复方案

核心思路是全面清理控制字符+使用结构化日志参数传递,避免直接将未处理的用户输入写入日志。

1. 编写日志内容清理工具方法

这个方法会处理所有ASCII控制字符、结构化日志敏感符号,确保输出的日志内容安全:

private string SanitizeLogValue(string input)
{
    if (string.IsNullOrEmpty(input))
        return input;

    // 替换所有ASCII控制字符(0x00-0x1F,空格除外),用十六进制标记便于后续排查
    var controlChars = new[] { '\t', '\v', '\f', '\a', '\b', '\0' };
    foreach (var c in controlChars)
    {
        input = input.Replace(c.ToString(), $"_0x{(int)c:X2}_");
    }

    // 转义JSON/结构化日志的特殊字符,避免破坏日志结构
    input = input.Replace("\"", "\\\"")
                 .Replace("\\", "\\\\");

    // 统一转义换行回车,替代自定义标记,更符合日志标准格式
    input = input.Replace("\n", "\\n")
                 .Replace("\r", "\\r");

    return input;
}

2. 修改日志记录逻辑

改用结构化日志的参数化写法(而非直接传入字符串),让日志框架自动处理参数安全:

public void AddTracing(Dictionary<string, string> keyValueCollection, Exception? exceptionDetails)
{
    foreach (KeyValuePair<string, string> dicItem in keyValueCollection)
    {
        if (dicItem.Key.Equals(Constant.LogMessage))
        {
            var sanitizedVal = SanitizeLogValue(dicItem.Value);
            // 使用占位符传递参数,日志框架会自动处理转义
            _logHelper.LogInformation("SVal: {SanitizedValue}", sanitizedVal);
        }
    }
}

关键说明

  • 结构化日志参数化:大多数现代日志框架(比如Microsoft.Extensions.Logging、Serilog、NLog)都支持参数化日志,这是预防CWE-117的最佳实践,框架会自动处理输入中的特殊字符,避免日志注入。
  • 全面清理控制字符:控制字符可能会恶意打乱日志格式、触发日志解析器异常,甚至在某些场景下执行恶意逻辑,必须全部处理。
  • 结构化日志兼容:如果你的日志最终会以JSON等结构化格式存储,转义引号、反斜杠等符号能避免破坏JSON结构,确保日志可正常解析。

内容的提问来源于stack exchange,提问作者sameera guntimadugu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:16:00