log4j安全配置-防御日志注入
【摘要】 https://bbs.huaweicloud.com/blogs/444386前面梳理了CRLF注入,其中有一条就是关于日志注入的,除了手动的方式,就是我们经常使用的log4j本身就提供了CRLF防御手段,仅需一个简单的配置log4j配置文件示例截取其中的一个appender做介绍 <!-- 将日志信息输出到控制台 --> <appender name="ConsoleAppe...
https://bbs.huaweicloud.com/blogs/444386
前面梳理了CRLF注入,其中有一条就是关于日志注入的,除了手动的方式,就是我们经常使用的log4j本身就提供了CRLF防御手段,仅需一个简单的配置
普通过滤方法
定义过滤方法,过滤消息内容
/**
* 过滤CRLF注入
*
* @param msg 消息
* @return 过滤后的内容
*/
public static String cleanCRLFMsg(String msg) {
if(msg == null) {
return null;
}
return msg.replaceAll('\n','_').replaceAll('\r','_');
}
log4j配置文件
示例
截取其中的一个appender做介绍
<!-- 将日志信息输出到控制台 -->
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
</layout>
<!--过滤器设置输出的级别-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- 设置日志输出的最小级别 -->
<param name="levelMin" value="WARN" />
<!-- 设置日志输出的最大级别 -->
<param name="levelMax" value="ERROR" />
<!-- 设置日志输出的xxx,默认是false -->
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
PatternLayout
patternLayout可以用来定义输出的样式,例如上面的示例就是,输出按照value的方式格式进行输出。其中的%m就是打印的日志具体信息,而我们需要控制输出的就是%m。
Log4j安全配置
我们只需要定义patternLayout时,添加log4j支持的配置即可。
%enc{%m}{CRLF}
调整为如下后,打印日志,则就会自动过滤掉换行符
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%enc{%m}{CRLF}%n%n" />
</layout>
%replace{%m}{[\r\n]}{}
%replace的作用就是替换打印的消息,是使用正则的方式进行替换,下面的value就是将\r\n替换为空字符
<!-- 设置日志输出的样式 -->
<layout class="org.apache.log4j.PatternLayout">
<!-- 设置日志输出的格式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%replace{%m}{[\r\n]}{}%n%n" />
</layout>
异常内容打印
上述仅对正常的日志内容进行了打印,但是对于异常的消息却无法通过上述进行防御,如果异常的消息打印时,包含了CRLF字符,就会导致日志注入情况。
不过需要造成这个情况,需要满足两个条件 1.能造成异常 2.造成的异常打印时,内容包含用户可控制的消息。
ThrowablePatternConverter
可通过定制该类,重写方法,异常信息打印时,即可保证消息不被注入。
// todo 待补充完整的 ThrowablePatternConverter的代码实现
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)