Как избежать 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");
Другие вопросы по тегам