在 logback 中转义 HTML

Escape HTML in logback

我们有一个 Spring 项目将 Logback 与 SLF4J 结合使用。我一直致力于在我们的项目中构建 Log Forging 预防。我已经使用 owasp.security-logging-logback 来替换日志中的 CRLF 字符。

pattern: %d ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %crlf(%m%ex) %n

除此之外,我们还想通过 转义记录消息中存在的 HTML 来添加 XSS 保护。我一直没能找到任何在模式中引入转义 HTML 的方法。

log4j 具有 %encode{} 转换模式。 SLF4J 中有类似的东西吗? 如果没有,您能指导我如何为此构建解决方案吗?

我找不到可以与 logback 集成并对 HTML 字符进行编码的现有库或工具。所以我创建了一个自定义的 logback MessageConverter。

import org.apache.commons.text.StringEscapeUtils;
import ch.qos.logback.classic.pattern.MessageConverter;

public class HtmlContentEncoderMessageConverter extends MessageConverter {
    @Override
    public String convert(ILoggingEvent event) {
        return StringEscapeUtils.escapeHtml4(super.convert(event));
    }
}

我在 logback-spring.xml,

的 logback 配置中添加了这个转换器
<conversionRule conversionWord="htmlEncode" converterClass="<path_to_class>.HtmlContentEncoderMessageConverter">

最后在 application.properties,

的日志模式中使用了这个 conversionWord
logging.pattern.console: %d ${LOG_LEVEL_PATTERN:-5%p} ... %crlf(%htmlEncode{%m%ex})

没有消息转换器的日志,

This is a
test quote with HTML
< testTag >.

使用 crlfhtmlEncode 消息转换器进行记录,

This is a_test quote with HTML_&lt testTag &gt

其他尝试过的方法,

  • 我尝试使用 OWASP Security Logging Logback,但是 OWASP 日志记录优先于 logback,这意味着我必须用 OWASP 安全日志记录函数替换所有日志记录函数。这需要太多的工作,所以这个方法被放弃了。