智能锁东莞网站建设,唯品会一家专门做特卖的网站手机版,淘宝客建立网站,网站开发常用的数据库背景
日志注入一般指的是恶意用户输出换行等内容#xff0c;混淆正常的日志#xff0c;导致排查问题是无法正确定位问题#xff0c;因此#xff0c;我们需要对要打印的日志内容进行过滤。 但是#xff0c;如果是每个接口单独处理的话#xff0c;成本较高#xff0c;因此…背景
日志注入一般指的是恶意用户输出换行等内容混淆正常的日志导致排查问题是无法正确定位问题因此我们需要对要打印的日志内容进行过滤。 但是如果是每个接口单独处理的话成本较高因此我们需要一个统一处理的机制。
当然统一处理可能会误伤正常的日志这个需要自己进行斟酌了。我们在绝大情况下不会在打印日志的内容中使用换行等特殊字符所以这样处理我认为是比较稳妥的。
这个处理仅会对用户输入的参数进行处理不会对堆栈的正常的内容处理所以大部分的日志是可以正常打印出来的。
方案
springboot集成的logback其配置文件是 org/springframework/boot/logging/logback/base.xml其默认参数配置都在org/springframework/boot/logging/logback/defaults.xml。我们不打算修改这些配置而是沿用。
我们对logback进行定制spring集成的默认log_pattern为-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-ddTHH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(%applicationName[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}中间可以全部不管输出的重点就是靠后部分的%m这个是一个Converter对消息进行处理默认是不进行任何处理直接输出原消息我们对他进行定制。
我们自定义自己的Converter: import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.slf4j.helpers.MessageFormatter;/*** author */
public class LineSeparatorConverter extends ClassicConverter {Overridepublic String convert(ILoggingEvent event) {Object[] argumentArray event.getArgumentArray();// 没有用户传入的参数直接返回if (argumentArray null || argumentArray.length 0) {return event.getFormattedMessage();}Object[] argumentArrayProcessed new Object[argumentArray.length];for (int i 0; i argumentArray.length; i) {Object o argumentArray[i];if (o null || o instanceof Throwable) {argumentArrayProcessed[i] o;} else {String oString o.toString();argumentArrayProcessed[i] cleanLineSeparator(oString);}}return getFormattedMessage(event.getMessage(), argumentArrayProcessed);}public String getFormattedMessage(String message, Object[] argumentArray) {String formattedMessage;if (argumentArray ! null) {formattedMessage MessageFormatter.arrayFormat(message, argumentArray).getMessage();} else {formattedMessage message;}return formattedMessage;}private String cleanLineSeparator(String line) {if (line null || line.isEmpty()) {return line;}return line.replace(\n, \\n).replace(\r, \\r);}}
然后声明logback-spring.xml使用spring的默认配置并且覆盖%m的默认Converter改成我们自己的
?xml version1.0 encodingUTF-8?configuration scantrue scanPeriod60 seconds debugfalseinclude resourceorg/springframework/boot/logging/logback/base.xml/!-- 将默认的输出器改为自定义输出器会替换掉换行符防止日志注入 --conversionRule conversionWordmconverterClassxxx.LineSeparatorConverter//configuration
如果放到了resources目录下该文件应该可以正常识别到不需要额外配置。 如果日志处理是一个maven的子模块那就手动声明一下文件位置 logging.configclasspath:logback-spring.xml 如果放到其他目录写成logging.configfile:/xxx/xxx/logback-spring.xml