可行但需配套净化能力,核心是dompurify驱动的白名单过滤;推荐spring aop+自定义注解实现,支持字段指定、严格模式、标签/属性白名单、危险模式移除、二次编码及结构化审计日志。

直接在后端接口方法上加注解,就能触发 HTML 安全检查,这个思路可行,但“一键”不等于“零配置”——它依赖你已搭建好底层净化能力。核心不是注解本身,而是注解背后绑定的过滤逻辑是否可靠、可配、可审计。
注解只是入口,安全靠的是 DOMPurify 驱动的白名单净化
你要的不是语法糖,而是可落地、可追溯、可灰度的安全切面。推荐用 Spring AOP + 自定义注解 + DOMPurify 封装实现,关键点如下:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
注解声明要带参数,支持按场景开关策略
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface SanitizeHtml { String[] fields() default {}; // 指定哪些入参字段需净化(如 "content", "description") boolean strict() default true; // 是否启用严格模式(禁用所有非白名单标签/属性) String[] allowTags() default {"p", "br", "strong", "em", "a", "ul", "ol", "li"}; String[] allowAttrs() default {"href", "target"}; } -
切面逻辑必须调用 DOMPurify(服务端 Java 版推荐使用
jsoup或owasp-java-html-sanitizer,而非前端 DOMPurify)
实际执行时,不是简单替换<script></script>,而是:- 解析 HTML 字符串为 DOM 树
- 递归遍历节点,只保留
allowTags中的标签 - 对每个属性校验是否在
allowAttrs中,且href值需匹配^https?://或^/# - 移除所有
on*事件属性、javascript:协议、data:URI 等危险模式 - 对剩余文本内容做二次实体编码(如
→ <code><),防止渲染时被浏览器误解析
-
审计日志必须自动记录每次净化行为
每次触发注解,应同步写入结构化日志,包含:- 原始 HTML 片段(截断前200字符,防日志爆炸)
- 净化后 HTML 片段
- 被移除的标签/属性列表(如
["script", "onerror", "iframe"]) - 执行耗时、是否触发告警(如检测到
eval(或base64编码脚本)
-
不建议对富文本字段做“存储即净化”,而应“读写双检”
- 写入前:用注解净化并存 clean HTML
- 渲染前:再走一遍轻量级校验(比如检查是否存在未闭合
、是否含 <code><script> 等绕过尝试) </script> - 这样即使数据库被绕过或历史数据污染,也能兜底拦截
不复杂但容易忽略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










