CodeQL 文档

从用户输入创建的日志条目

ID: cs/log-forging
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-117
Query suites:
   - csharp-code-scanning.qls
   - csharp-security-extended.qls
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

如果未经处理的用户输入被写入日志条目,则恶意用户可能能够伪造新的日志条目。

如果用户提供了一些在显示日志输出时会被解释的字符,则可能会发生伪造。如果日志显示为纯文本文件,则恶意用户可以使用换行符。如果日志显示为 HTML,则可以包含任意 HTML 来伪造日志条目。

建议

在记录用户输入之前,应进行适当的编码。

如果日志条目是纯文本,则应使用 String.Replace 或类似方法从用户输入中删除换行符。还应注意,用户输入在日志条目中应清晰标记,并且恶意用户不能以其他方式造成混淆。

对于将以 HTML 显示的日志条目,在记录之前,应使用 HttpServerUtility.HtmlEncode 或类似方法对用户输入进行 HTML 编码,以防止伪造和其他形式的 HTML 注入。

示例

在以下示例中,使用日志记录框架记录用户提供的用户名。在第一种情况下,它在没有任何清理的情况下被记录。在第二种情况下,使用 String.Replace 确保用户输入中不存在任何行尾。

using Microsoft.Extensions.Logging;
using System;
using System.IO;
using System.Web;

public class LogForgingHandler : IHttpHandler
{
    private ILogger logger;

    public void ProcessRequest(HttpContext ctx)
    {
        String username = ctx.Request.QueryString["username"];
        // BAD: User input logged as-is
        logger.Warn(username + " log in requested.");
        // GOOD: User input logged with new-lines removed
        logger.Warn(username.Replace(Environment.NewLine, "") + " log in requested");
    }
}

参考资料

  • ©GitHub 公司
  • 条款
  • 隐私