XSS防御

大哥大姐帮我问一下,XSS防御
最新回答
平山渡

2026-07-28 23:49:05

XSS(跨站脚本攻击)防御是Web应用安全的重要环节,上述代码提供了一套完整的XSS防护方案,涵盖JSON处理、请求过滤和参数净化等多个层面。以下是对该方案的详细解析:

一、核心防御机制
  1. 多层防护体系
  • 输入净化:通过自定义XssRequestWrapper对所有请求参数和头部进行HTML转义
  • 序列化控制:使用Jackson自定义序列化器/反序列化器处理JSON数据流
  • 路径过滤:通过XssFilter对特定路径放行,减少不必要的处理开销
  1. 技术实现亮点
  • 采用Spring的HtmlUtils.htmlEscape()实现标准HTML实体转义
  • 通过HttpServletRequestWrapper实现请求参数的透明处理
  • 使用Jackson的SimpleModule机制无缝集成序列化过程
二、关键组件分析
  1. JSON处理模块
// 反序列化器(输入防护)public class XssJsonDeserializer extends JsonDeserializer<String> { @Override public String deserialize(JsonParser p, DeserializationContext ctxt) { return HtmlUtils.htmlEscape(p.getValueAsString()); }}// 序列化器(输出防护)public class XssJsonSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) { gen.writeString(HtmlUtils.htmlEscape(value)); }}
  • 作用:确保所有通过Jackson处理的JSON字符串都经过转义
  • 特点:同时防护JSON输入和输出,形成完整的数据处理闭环
  1. 请求过滤器
public class XssFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { String path = ((HttpServletRequest) request).getServletPath(); // 白名单机制 if (shouldBypass(path)) { chain.doFilter(request, response); return; } chain.doFilter(new XssRequestWrapper((HttpServletRequest) request), response); } private boolean shouldBypass(String path) { return path.equals("/") || StringUtils.containsAny(path, "/assets", "/templates", "/mapper", "/oauth"); }}
  • 优化点:通过路径白名单减少性能开销
  • 执行顺序:@Order(Ordered.HIGHEST_PRECEDENCE)确保优先执行
  1. 请求包装器
public class XssRequestWrapper extends HttpServletRequestWrapper { @Override public String getParameter(String parameter) { return clean(super.getParameter(parameter)); } private String clean(String value) { return StringUtils.isEmpty(value) ? "" : HtmlUtils.htmlEscape(value); }}
  • 处理范围:覆盖getParameter、getParameterValues、getHeader等核心方法
  • 空值处理:对null值进行安全转换,避免NPE
三、防御效果评估
  1. 防护范围
  • ✅ 表单数据(application/x-www-form-urlencoded)
  • ✅ JSON数据(application/json)
  • ✅ 请求头信息
  • ❌ 二进制数据(需额外处理)
  1. 转义规则
  • < → &lt;
  • > → &gt;
  • " → &quot;
  • ' → &#39;
  • & → &amp;
四、优化建议
  1. 性能优化
// 使用缓存优化重复转义private static final Map<String, String> escapeCache = new ConcurrentHashMap<>();private String clean(String value) { if (StringUtils.isEmpty(value)) return ""; return escapeCache.computeIfAbsent(value, HtmlUtils::htmlEscape);}
  1. 增强配置
// 通过配置文件自定义排除路径@Value("${xss.filter.exclude-paths:/assets,/templates}")private String[] excludePaths;
  1. 内容安全策略建议补充HTTP头防护:
response.setHeader("Content-Security-Policy", "default-src 'self'");五、部署注意事项
  1. 模块注册
@Beanpublic Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { return builder -> builder.modules(new SimpleModule() .addDeserializer(String.class, new XssJsonDeserializer()) .addSerializer(String.class, new XssJsonSerializer()));}
  1. 过滤器顺序确保在字符编码过滤器之后:
# application.propertiesserver.servlet.filter.xss.order=0

该方案通过多层次的防护机制,能够有效阻止大多数XSS攻击尝试。但需注意:

  1. 对于富文本内容需要特殊处理(可结合白名单过滤库如OWASP Java HTML Sanitizer)
  2. 定期进行安全测试验证防护效果
  3. 保持依赖库(如Spring、Jackson)的版本更新