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

如何消除SAST扫描中的Log Forging(日志伪造)警告?

解决ASP.NET Core 8 Web API中日志伪造(Log Forging)的SAST警告问题

你当前的问题是SAST扫描工具没识别到自定义的日志清理逻辑,或者现有写法的拼接方式本身就容易触发警告。可以从以下几个方面调整:

1. 改用结构化日志(最有效)

不要用string.Concat拼接日志内容,改用日志框架的结构化占位符写法。这种方式从根源上避免日志注入,而且几乎所有SAST工具都会认可这种安全写法:

_logger.LogDebug("NotFound状态触发,用户输入:{UserInput}", SanitizeLogMessage(Expression.UserInput));

如果需要同时记录状态码,也分开作为参数传入:

_logger.LogDebug("状态码:{StatusCode},用户输入:{UserInput}", HttpStatusCode.NotFound, SanitizeLogMessage(Expression.UserInput));

2. 优化日志清理函数,让SAST工具更容易识别

现有清理函数可能覆盖的换行字符不全,而且命名或写法没被工具规则匹配。调整清理逻辑,覆盖所有可能的换行/注入字符:

private static string SanitizeLogMessage(string message)
{
    if (string.IsNullOrWhiteSpace(message))
    {
        return string.Empty;
    }

    // 移除所有换行相关字符(含Unicode标准换行符)
    message = Regex.Replace(message, @"[\r\n\u000A\u000D\u0085\u2028\u2029]", string.Empty);
    // 仅保留可打印ASCII字符
    message = Regex.Replace(message, @"[^\u0020-\u007E]", string.Empty);
    // 可选:截断过长输入,避免日志冗余或恶意填充
    return message.Length > 200 ? message[..200] + "..." : message;
}

3. 简化调用逻辑,避免不必要的转换

你原来的代码里用了Convert.ToString(SanitizeLogMessage(...)),但SanitizeLogMessage已经返回字符串,多余的转换可能让SAST工具无法追踪到清理步骤。直接传入清理后的结果即可。

为什么这样能解决问题?

SAST工具大多依赖静态分析规则,自定义清理函数如果没被工具的规则库标记为“安全清理方法”,就可能被忽略。而结构化日志的占位符写法是行业通用的安全实践,工具会直接判定为无日志伪造风险;同时优化后的清理逻辑覆盖了更多风险字符,也更容易被工具识别为有效防护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:37:04