1

我为我的应用程序生成了 Fortify 报告。在 Fortify 报告中,它在以下代码中显示了日志伪造问题:

holDate = ((MaintainHolidayCalenderForm) form).getCALENDER_DATE();
logger.info("This is some description" + holDate + holName );

根据一些人的建议,我已将“/n”替换为“ ”,将“/r”替换为“ ”,但问题仍未解决。

谁能告诉我如何解决这个问题?

提前致谢。

4

1 回答 1

3

黑名单修复,例如删除日志清除字符 (/n /r),仍然为攻击者留下了对您的应用程序进行恶意操作的机会。如果 holDate 和 holName 是从浏览器提交的,它们是 UTF-8 字符串,它可以很长并且包含相当大的 UTF-8 unicode 字符集中的任何字符。如果通常使用 HTML 查看器(常见)查看日志,则示例攻击可能如下所示:攻击者可以伪造一条记录,表明他们已注销,做他们的坏事,然后编写一条日志消息,使用任何导致退格或 dels 的 unicode 字符返回到“友好的攻击者已注销 - 此处无内容”消息。(注意:你永远不应该尝试预测攻击者可能如何影响坏事,所以不要'

您应该确保写入日志的数据是您期望的类型,也称为白名单验证,并且长度合理,而不是列入黑名单。

所以修复(在您发布的代码中): 1. 如果 holDate 还不是,请确保它是一个 Date 对象(java.util.Date)。
2. HolName 可能是一个长度相对较小的字母数字字符串。选择一个较小的长度(如 30 个字符)并确保 holName 中只接受字母数字字符。
您可以在检查长度后使用正则表达式String.matches("^[a-zA-Z0-9]*$")来确保您只接受字母数字字符。

您可能应该在表单 pojos 的设置器中执行此白名单输入验证。

于 2014-07-08T17:49:47.770 回答