编辑在富文本里加粗了一段,保存后详情页显示成 <b>加粗</b>,源码里能看到实体被转义了两次,纯文本字段倒是正常。乍看像缓存或者权限的锅,追下去往往不是。
grep -n 'HtmlUtils.htmlEscape' src/main/java/**/XssFilter.java curl -s -X POST http://127.0.0.1:8080/api/articles -d @rich_text.json
追下去是这么回事:全局 XSS 过滤器对所有入参做了 HTML 转义,富文本字段也被一起处理。存进库的已经是实体,渲染时模板又转义一次。安全过滤和业务字段没有分开,一刀切把合法标签也拦了。
「富文本转义入库」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,富文本字段走白名单清洗 只保留 p b i ul li 这类标签;纯文本字段继续用全量转义;渲染时按字段类型选择是否转义 不要统一处理;把那条加粗内容重新保存一次看页面。
验收就看一点,详情页显示加粗效果 数据库里存的是 b 标签而不是实体。
