2011-04-28 79 views
2

在我們的日誌中,我們看到信用卡號碼是由於人們在CC信息中點擊應用程序中的某些ULR(我不知道他們爲什麼這樣做)。我們希望消毒這些信息(因爲PCI考慮因素),甚至不會將其保存到磁盤。消毒Tomcat訪問日誌條目

因此,我希望能夠在日誌條目達到日誌文件之前對其進行清理。我一直在看Tomcat閥(Access Log Valve)。這是要走的路嗎?

回答

3

我能夠通過擴展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,然後把該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"'/>