黑名单修复,例如删除日志清除字符 (/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 的设置器中执行此白名单输入验证。