测试阶段通过反射探测类图拓扑并自动识别高风险字段组合,核心在于不依赖源码或编译产物,仅靠运行时类加载与元数据扫描,定位敏感字段、越权标识、未校验输入及其关联关系。
测试阶段通过反射探测类图拓扑并自动识别高风险字段组合,核心在于:**不依赖源码或编译产物,仅靠运行时类加载与元数据扫描,定位敏感字段(如密码、密钥、token)、越权标识(如 isadmin、rolelevel)、未校验输入(如 rawinput、unescapedhtml)及其关联关系**。这不是画uml图,而是构建“可执行的风险语义图”。
一、用 Reflections 扫描类继承与注解拓扑
先建立轻量级元数据索引,覆盖所有待测类路径:
- 配置扫描器只启用
TypesAnnotated和FieldsAnnotated,避免方法/构造器等冗余开销 - 重点捕获自定义注解(如
@Sensitive、@BypassAuth、@RawData)和 JDK 标准注解(如@Transient、@JsonIgnore) - 递归获取每个类的
getSuperclass()和getInterfaces(),构建父子/实现关系链;用 Map<Class, Set<Class>> 存储,避免重复遍历
二、基于字段语义规则匹配高风险组合
单纯找 password 字段没意义——关键在“上下文组合”。例如:
-
认证绕过组合:类含
@RestController+ 字段名含auth|token|login+ 类型为String或Object,且无@NotBlank或@NotNull -
敏感数据泄露组合:字段含
key|secret|credential+ 类被@ConfigurationProperties标记 + 该类又被@Component或@Service加载 -
越权写入组合:字段名含
role|permission|status+ 修饰符为public或protected+ 所在类有@RequestBody参数的 POST 方法
三、运行时反射验证字段可访问性与默认值
静态扫描只能看声明,真正风险在运行时行为:
- 对候选字段调用
Field.setAccessible(true),尝试读取其默认值(如null、空字符串、硬编码明文),标记“未初始化敏感字段” - 若字段类型是集合(
List/Map),检查是否被@Valid约束;未约束则视为“可注入任意结构数据” - 对含
setXXX方法的字段,用反射调用并传入恶意值(如"admin'; DROP TABLE users--"),观察是否抛出校验异常——不抛即为校验缺失
四、输出可操作的风险报告结构
报告不是列表,而是带影响路径的节点图:
- 每个风险项标注:所在类全限定名 → 字段名 → 关联注解 → 所属 Spring Bean 名(如有)→ 是否参与 HTTP 请求绑定(通过
@RequestMapping扫描反推) - 自动聚类:将同一 Controller 下多个
@RequestBody类中含相似字段组合的实例合并,提示“批量越权风险面” - 附带修复建议:如“建议将
userRole字段改为private+ 添加@Pattern(regexp = "USER|ADMIN")”

















