从用户输入创建的日志条目¶
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
如果未经处理的用户输入被写入日志条目,则恶意用户可能能够伪造新的日志条目。
如果用户提供了一些在显示日志输出时会被解释的字符,则可能会发生伪造。如果日志显示为纯文本文件,则恶意用户可以使用换行符。如果日志显示为 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");
}
}