对于 Apache Log4J Audit,我不能说太多,因为我从未看过它(尽管 20 秒浏览其主页似乎表明它更多的是尝试结构化日志消息,然后 SIEM 将知道如何解析,而不是进行过滤/编码/等的任何类型的“安全”日志记录)。至于 ESAPI,虽然 ESAPI 确实在某种程度上处理了“安全日志记录”,但 IIRC(没有验证)它确实对异常没有多大作用. 主要是 ESAPI 的日志记录信任异常堆栈,更关注错误消息本身。通常对于安全设计,除非经过验证,否则绝不应将用户数据放在异常消息中。但是这种验证不是一般的日志框架可以做到的。对于日志框架,它必须能够处理任何Exception
(或者可能是Throwable
YMMV)和任何字符串,并且当它到达日志框架时,特定的上下文是应该如何验证的内容已经丢失。
ESAPI 的“安全日志”主要包括将“\r”或“\n”字符作为记录的“消息”字符串的一部分(不是异常)替换为“_”(以防止日志注入),并可选择进行 HTML 实体输出编码在消息上(以防有人打算在浏览器中仔细阅读日志消息;目的是防止通过日志消息进行 XSS 攻击)。尽管您可以通过足够的努力将其扩展为做其他事情(例如,过滤掉 ESC 序列等)。
最终,为了完全防止日志注入攻击,您必须在记录之前验证所有不受信任的数据。ESAPI 的Validator可以帮助您,但作为开发人员,您仍然需要在适当的时候使用适当的验证标准调用它。
201 年 12 月 29 日添加:就使用 ESAPI 而言Validator
,我并不是要使用 ESAPI 进行输出编码Encoder
。相反,您将创建一个正则表达式来将您的预期数据列入白名单,并将其放入您的validation.properties中,然后调用其中一种Validator.getValidInput()
方法。如果您没有被ValidationException
抛出,根据您的正则表达式,输出应该是“安全的”。(请注意,您可能需要在多个地方使用许多不同的正则表达式来执行此操作。)OTOH,我不能保证会让您的 Coverity 扫描满意,因为它不可能知道您提供的正则表达式是否是一个合适的或不合适的。(我也不认为它会做那么深入的数据流分析以认为它是“安全”的。)