3

製品で報告された CWE 117 の問題があります。

CWE 117 の問題は、ソフトウェアがログに書き込まれる出力を適切にサニタイズしないか、誤ってサニタイズすることです。考えられる解決策の 1 つは、ログ記録中に以下を追加することでした。

String clean = args[1].replace('\n', '_').replace('\r', '_');

log.info(clean);

私の質問は、単一の変更でこの問題を解決できる中心的な場所が log4j にあるかどうかです。

4

1 に答える 1

3

ログ メッセージのシリアル化を担当するのはLayoutであり、ここに改行変換コードが属します。

PatternLayout変換を行う独自の (自明な) サブクラスを作成することをお勧めします。これは、こちらの Log4j メーリング リストでも議論されています。そのスレッドで提案されているソリューションのわずかに変更されたバージョンを次に示します。

import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;

public class NewLinePatternLayout extends PatternLayout {

    public NewLinePatternLayout() { }

    public NewLinePatternLayout(String pattern) {
        super(pattern);
    }

    public boolean ignoresThrowable() {
        return false;
    }

    public String format(LoggingEvent event) {
        String original = super.format(event);

        // Here your code comes into play
        String clean = original.replace('\n', '_').replace('\r', '_');

        StringBuilder sb = new StringBuilder(clean);

        String[] s = event.getThrowableStrRep();
        if (s != null) {
            for (int i = 0; i < s.length; i++) {
                sb.append(s[i]);
                sb.append('_');
            }
        }
        return sb.toString();
    }
}

関連する質問(役立つ可能性がある回答付き):

于 2015-06-18T12:33:15.843 に答える