Очистка записей журнала доступа Tomcat - PullRequest
2 голосов
/ 28 апреля 2011

В наших журналах мы видим номера кредитных карт из-за того, что люди обращаются к некоторым ULR в нашем приложении с информацией CC (я понятия не имею, почему они это делают). Мы хотим очистить эту информацию (из соображений PCI) и даже не сохранять ее на диск.

Следовательно, я хочу иметь возможность дезинфицировать запись в журнале, прежде чем она попадет в файл журнала. Я смотрел на Tomcat Valves (Access Log Valve). Это путь?

1 Ответ

3 голосов
/ 30 апреля 2011

Я смог решить эту проблему, расширив AccessLogValve и переопределив public log(java.lang.String message):

public class SanitizedAccessLogValve extends AccessLogValve {

    private static Pattern pattern = Pattern.compile("\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})\\b");

    /*
     This method will sanitize any cc numbers in the string and replace them with x's
    */
    private String sanitize(String string) {
        String sanitizedString = string;

        if(string != null) {

            StringBuffer buffer = new StringBuffer();
            Matcher matcher = pattern.matcher(string);

            while(matcher.find()) {
                MatchResult matchResult = matcher.toMatchResult();

                int start = matchResult.start();
                int end = matchResult.end();

                String matchedText = string.substring(start, end);

                matcher.appendReplacement(buffer, "xxxxxxxxxxxxxxxx");                
            }

            matcher.appendTail(buffer);

            sanitizedString = buffer.toString();
        }

        return sanitizedString;
    }

    @Override
    public void log(String message) {
        super.log(sanitize(message));
    }
}

Вам необходимо скомпилировать это в банкуи затем поместите этот файл jar в $CATALINA_HOME/lib.

Затем в ваш server.xml:

<Valve className="my.valves.SanitizedAccessLogValve"
       directory="access_logs"  prefix="localhost." suffix=".log"
       pattern='%v %h %t "%r" %s %B %T "%{User-Agent}i"'/>
...