关键在于在反序列化和校验两个环节同时设防——需配置Jackson解析限制(如max-nesting-depth=10、禁用default-typing),DTO中用@Size(max=1000)约束集合,禁用级联校验,并在网关层设请求体上限与数组频次拦截。

防范攻击者用超长 JSON 数组参数耗尽校验内存,关键在于**在反序列化和校验两个环节同时设防**——不能只依赖 Jackson 解析时的限制,还要堵住校验器(如 Hibernate Validator)遍历超大集合时的内存膨胀漏洞。
限制 JSON 解析层的数组长度与嵌套深度
Spring Boot 默认用 Jackson 解析请求体,需主动配置防护参数:
- 在 application.yml 中设置全局解析上限:
spring.jackson.deserialization.fail-on-trailing-tokens=true
spring.jackson.deserialization.max-nesting-depth=10
spring.jackson.deserialization.max-number-length=16 - 对数组字段做显式约束:在 DTO 类中用 @Size(max = 1000) 注解限制集合大小,配合 @Valid 触发校验;Jackson 会先解析再校验,但 size 校验本身不消耗额外内存
- 禁用自动类型推断:关闭 spring.jackson.mapper.default-typing=none,防止攻击者用
@class字段触发危险类加载
避免校验器遍历超大集合引发 OOM
Hibernate Validator 默认会对集合内每个元素递归校验,若数组含 10 万条数据,即使每条只校验一个 @NotBlank,也会创建 10 万个校验上下文对象。
- 对高风险接口(如批量导入、列表提交),改用 分页校验:前端按每页 100 条提交,后端用
@Validated(ValidationGroups.Batch.class)分组控制 - 在 Controller 层加前置检查:用 ObjectMapper.readTree() 轻量解析 JSON,提取数组字段并判断
arrayNode.size() <= 1000,超限直接返回 400,跳过完整反序列化 - 禁用级联校验:DTO 中避免对集合字段标注
@Valid,除非业务强依赖逐条校验;可用自定义 ConstraintValidator 实现“仅校验前 N 条”逻辑
网关层兜底拦截恶意大 Payload
把防御前移到流量入口,避免无效请求进入应用 JVM:
- 在 API 网关(如 Spring Cloud Gateway)配置路由级请求体大小限制:
spring.cloud.gateway.routes[0].filters[0]=SetSize=1048576 # 1MB 上限 - 用自定义 GlobalFilter 检查 Content-Type 为
application/json的请求体,用流式方式读取前 8KB,统计左方括号[出现频次,若 1KB 内出现超 200 次,视为可疑数组膨胀,直接拦截 - Kubernetes 中为 Pod 设置内存 limit(如
limits.memory: 1Gi),配合 JVM-XX:+ExitOnOutOfMemoryError,确保单个恶意请求不会拖垮整个实例


















