Java 将CR/LF添加到日志消息以提高可读性是否是一种不好的做法

Java 将CR/LF添加到日志消息以提高可读性是否是一种不好的做法,java,logging,owasp,Java,Logging,Owasp,我们有一种方法,用于在日志文件中记录java异常。该方法允许调用者传递他们希望在日志消息中显示的变量,以便进行调试,并使用插入空行和制表符使消息突出,更具可读性 然而,我看到的所有防止日志伪造攻击的建议都建议从日志消息中剥离所有CRLF 在日志消息中包含CRLF被认为是不好的做法吗?此方法仅在内部使用,任何用户提供的信息都可以在传递给该方法之前进行消毒。通常-是 虽然乍一看这似乎是一个很好的特征,但是你应该考虑以下潜在的并发症: 根据具体的实现方式,如果将底层日志框架的多行作为多个日志调用,那么

我们有一种方法,用于在日志文件中记录java异常。该方法允许调用者传递他们希望在日志消息中显示的变量,以便进行调试,并使用插入空行和制表符使消息突出,更具可读性

然而,我看到的所有防止日志伪造攻击的建议都建议从日志消息中剥离所有CRLF

在日志消息中包含CRLF被认为是不好的做法吗?此方法仅在内部使用,任何用户提供的信息都可以在传递给该方法之前进行消毒。

通常-是

虽然乍一看这似乎是一个很好的特征,但是你应该考虑以下潜在的并发症:

根据具体的实现方式,如果将底层日志框架的多行作为多个日志调用,那么您的语句可能会与其他并发日志语句交错,从而使生成的日志可读性降低 各种日志解析工具倾向于假设一行==一条语句。大多数人都知道如何解释多行但不超过多少行的异常堆栈跟踪,因此您可能会发现自己必须深入研究ELK stack/loggly configs之类的内容,以便向它传授您奇特的多行语句。 如果要打印到控制台,不同宽度的终端周围会出现复杂情况 一般来说,是的

虽然乍一看这似乎是一个很好的特征,但是你应该考虑以下潜在的并发症:

根据具体的实现方式,如果将底层日志框架的多行作为多个日志调用,那么您的语句可能会与其他并发日志语句交错,从而使生成的日志可读性降低 各种日志解析工具倾向于假设一行==一条语句。大多数人都知道如何解释多行但不超过多少行的异常堆栈跟踪,因此您可能会发现自己必须深入研究ELK stack/loggly configs之类的内容,以便向它传授您奇特的多行语句。 如果要打印到控制台,不同宽度的终端周围会出现复杂情况
我认为真正的问题是,您将输出的消息与希望存储在纯文本文件中的媒体紧密耦合。我建议您研究结构化日志框架,以及结构化日志可以使用的更强大的接收器,这样您就可以在不依赖消息格式技巧的情况下分析日志。

我认为真正的问题在于,您将输出的消息与希望存储在纯文本文件中的介质紧密耦合。我建议您研究结构化日志框架,以及可供结构化日志使用的更强大的接收器,这样您就可以在不依赖消息格式技巧的情况下分析日志。

我不认为这是坏事。它可能会破坏那些希望在一行中解析输出的工具,但如果这不是一个要求,那么就不用担心了。CR有点过时了,只要LF就可以了。我不太确定自己是否能回答,但我认为问题是当你在用户消息中留下CRLF时,而不是当你把它们放进去时。当用户在两个应该在一起的部分之间注入CRLF时,就会出现问题。如果问题特别是日志伪造攻击,那么您希望从输入中剥离换行,而不是从日志代码插入的换行。在您的日志记录方法中,您可以从传入的参数中删除换行符,并且仍然将它们记录在单独的一行中。@markspace我实际上在代码中使用System.getPropertyline.separator,但我在问题中使用了CRLF,因为攻击被称为CRLF注入。如果每个日志都是简单的一行,您可以轻松搜索有趣的日志使用像grep这样的工具。当日志条目分散在多行上时,grep搜索就变得不那么有用了。我不会说这不好。它可能会破坏那些希望在一行中解析输出的工具,但如果这不是一个要求,那么就不用担心了。CR有点过时了,只要LF就可以了。我不太确定自己是否能回答,但我认为问题是当你在用户消息中留下CRLF时,而不是当你把它们放进去时。当用户在两个应该在一起的部分之间注入CRLF时,就会出现问题。如果问题特别是日志伪造攻击,那么您希望从输入中剥离换行,而不是从日志代码插入的换行。在您的日志记录方法中,您可以从传入的参数中删除换行符,并且仍然将它们记录在单独的一行中。@markspace我实际上在代码中使用System.getPropertyline.separator,但我在问题中使用了CRLF,因为攻击被称为CRLF注入。如果每个日志都是简单的一行,您可以轻松搜索有趣的日志使用像grep这样的工具。当日志条目分布在多行上时,grep搜索就变得不那么有用了
将字符串输出到文本文件的OGG方法。在本地,我们使用文本编辑器查看日志文件。对于dev、test和prod,我们使用Splunk,它不存在将字符串显示为一行的问题。该方法将单个字符串传递给日志记录方法,该方法将字符串输出到文本文件。在本地,我们使用文本编辑器查看日志文件。对于dev、test和prod,我们使用Splunk,它不会将字符串显示为一行。