当前位置: 首页
AI教程
Spring Boot AntiSamy XSS多层防御从过滤器到反序列化

Spring Boot AntiSamy XSS多层防御从过滤器到反序列化

热心网友 时间:2026-07-08
转载

[024][Web模块]基于 AntiSamy 的 Spring Boot XSS 防护实践:从过滤器到反序列化的多层防御

跨站脚本攻击(XSS)依然是 Web 应用中最常见的安全威胁之一。本文从一个真实的企业级项目出发,详细拆解一套完整的 XSS 防护方案。方案的核心是 OWASP 的 AntiSamy 项目,用它作为清洗引擎,再通过 Servlet 过滤器和 Jackson 反序列化器这两层机制,分别拦截请求参数和 JSON 正文里的恶意代码。这样一来,用户输入的方方面面都能被覆盖到。下文会逐一剖析 XssHttpServletFilterXssJsonDeserializerXssSimpleModuleXssUtils 这四个核心组件的设计与实现,最后给出在 Spring Boot 里集成的示例。

1. 引言

XSS 攻击的本质其实很简单:攻击者把恶意脚本注入到一个看似可信的网站里,当其他用户访问时,脚本就在他们的浏览器中执行。传统的防御手段有很多,输出转义、输入校验、内容安全策略(CSP)等等。其中,输入清洗——也就是过滤掉 HTML 和 JS 里的危险内容——是一种覆盖面广且效果不错的防御手段。

本文介绍的方案基于 OWASP 的 AntiSamy。这是一个专门用来过滤用户提交的 HTML 和 CSS 内容的 Java 库。开发者只需提供一个策略文件(XML),就能精细控制哪些标签、属性、CSS 属性是允许的。和简单的正则替换相比,AntiSamy 能正确解析 HTML 结构,避免被绕过。

2. 整体架构

下图展示了 XSS 防护的整体数据流向:

HTTP Request (GET/POST) │ ▼┌──────────────────────┐│ XssHttpServletFilter │→ 包装 HttpServletRequest└──────────────────────┘ │ ▼ (表单参数、Query参数、请求头)┌──────────────────────────────┐│ XssHttpServletRequestWrapper │→ 重写 getParameter 等方法└──────────────────────────────┘ │ ▼ XssUtils.cleaning()← AntiSamy 清洗 │ ▼Controller 接收到的参数已清洗────────────────────────────HTTP Request (JSON Body) │ ▼┌─────────────────────┐│ XssSimpleModule │→ 注册到 Jackson ObjectMapper└─────────────────────┘ │ ▼┌─────────────────────────┐│ XssJsonDeserializer │→ 反序列化 String 字段时调用└─────────────────────────┘ │ ▼ XssUtils.cleaning() │ ▼@RequestBody 对象中的字符串已清洗

关键设计思想

  • 非侵入式:过滤器和 Jackson 模块都通过配置加入,业务代码不需要任何改动。
  • 分层防御:同时覆盖 application/x-www-form-urlencodedmultipart/form-dataquery stringapplication/json 这四种常见请求格式。
  • 可配置策略:通过修改 AntiSamy 的策略文件,可以灵活控制允许的标签,比如保留 ,但删除 Hello

    响应:

    Your comment: Hello