在我们的日志中,我们看到的是信用卡号码,因为人们在我们的应用程序中使用CC信息击中了一些ULR(我不知道为什么他们这样做)。我们想要清理这些信息(因为考虑了PCI),甚至不将它保存到磁盘上。
因此,我希望能够在日志文件到达日志文件之前对其进行清理。我一直在看Tomcat阀门(Access Log Valve)。这是要走的路吗?
答案 0 :(得分: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"'/>