Checkmarx 不理解静态方法。
String journeyId = request.getHeader("JOURNEY_ID");
journeyId = LogUtils.getUserInputText(journeyId);
LOGGER.info("journeyId=" + journeyId);
对于上面的代码,Checkmarx总是抱怨存在Log Forging,因为它认为journeyId
是来自用户输入。但LogUtils.getUserInputText
唯一允许返回 ascii 文本。但Checkmarx不承认这一点。然后我做了这个测试
String myJourneyId1 = request.getHeader("JOURNEY_ID");
LogUtils logUtils = new LogUtils();
myJourneyId1 = logUtils.getUserInputText(myJourneyId1);
LOGGER.info("myJoruneyId1=" + myJourneyId1);
我没有改变任何东西LogUtils
。我只在调用静态方法之前实例化它,现在Checkmarx不再抱怨了。
这是getUserInputText
public static String getUserInputText(final String input) {
if (StringUtils.isBlank(input)) {
return "";
}
return input.replaceAll("[^\\x20-\\x7E]", "\\uFFFD");
}
getUserInputText 中的内容无关紧要。Checkmarx 抱怨第一个,但没有抱怨第二个。他们正在调用相同的函数。
老实说,我对此感到非常沮丧。浪费了我整个下午来测试为什么我的修复没有解决日志伪造问题。最终我发现这是一个 checkmarx 问题。
更有趣的发现在这里:
如果我将 LogUtils 类移动到另一个依赖项目,无论我是否实例化,Checkmarx 总是抱怨日志伪造问题。