Как избежать CRLF (возврат каретки и перевод строки) при возврате - CWE 117
Я использую Logback, и мне нужно избегать CRLF(возврат каретки и перевод строки), когда я регистрирую пользовательский параметр.
Я попытался добавить свой класс, который расширяет ClassicConverter, на статическую карту PatternLayout.defaultConverterMap, но это не сработало.
Спасибо,
3 ответа
Вы должны создать пользовательский макет, как описано в документации logback
Пользовательский макет:
package com.foo.bar;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class RemoveCRLFLayout extends PatternLayout {
@Override
public String doLayout(ILoggingEvent event) {
return super.doLayout(event).replaceAll("(\\r|\\n)", "");
}
}
Конфигурация обратного входа:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.foo.bar.RemoveCRLFLayout">
<pattern>%d %t %-5p %logger{16} - %m%n</pattern>
</layout>
</encoder>
Для быстрого решения мы использовали
%replace
выражение в нашем шаблоне, чтобы заменить перевод строки и возврат каретки в сообщении.
Обратите внимание, что в этом примере используется свойство Spring Boot для установки шаблона, но вы можете использовать %replace в файле конфигурации Logback таким же образом.
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %replace(%msg){'\n|\r', '_'}%n"
(Моим первым выбором был бы настраиваемый конвертер, но у меня возникли проблемы с его работой с Spring Boot и Spring Cloud Config. Если вы хотите узнать больше об этом подходе, выполните поиск в документации журнала для
conversionRule
.)
ch.qos.logback.core.CoreConstants
;
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
ch.qos.logback.classic.pattern.LineSeparatorConverter
:
public String convert(ILoggingEvent event) {
return CoreConstants.LINE_SEPARATOR;
}
package ch.qos.logback.classic.PatternLayout
:
defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
Таким образом, правильный способ обеспечить окончание фиксированной линии - это свойство
line.separator
.
Такая же реализация для
java.lang.System.lineSeparator()
:
lineSeparator = props.getProperty("line.separator");