我在修复Fortify中的日志伪造问题时遇到了困难。问题是“将未经验证的用户输入写入日志”,这个问题来自于getLongFromTimestamp()方法中的两个日志调用。
public long getLongFromTimestamp(final String value) {
LOGGER.info("getLongFromTimestamp(" + cleanLogString(value) + ")");
long longVal = 0;
Date tempDate = null;
try {
tempDate = new SimpleDateFormat(FORMAT_YYYYMMDDHHMMSS, Locale.US).parse(value);
} catch (ParseException e) {
LOGGER.warn("Failed to convert to Date: " + cleanLogString(value) + " Exception: " + cleanLogString(e.getMessage()));
throw new Exception(e);
}
if (tempDate != null) {
longVal = tempDate.getTime();
}
return longVal;
}
private cleanLogString(String logString) {
String clean = logString.replaceAll("[^A-Za-z0-9]", "");
if(!logString.equals(clean)) {
clean += " (CLEANED)";
}
return clean;
}
cleanLogString()方法已经解决了我项目中的其他日志注入Fortify问题,但对上述两个问题没有影响。
非常感谢您的帮助!
getMessage
返回字符串的一部分的值,因此我怀疑在getMessage
返回的值上调用cleanLogString
将修复其中一个问题。另一个问题发生在LOGGER.info
调用上? - Neil SmithlinecleanLogString
函数作为清理污染数据的函数。我不确定为什么在某些地方它会识别它而在其他地方则不会。你是否在某个地方有自定义规则? - Neil Smithline