-
Notifications
You must be signed in to change notification settings - Fork 329
Labels
Milestone
Description
Bug 概述
HttpInvocationHandler 中参数数量与应用器数量不匹配,导致潜在的数组越界风险
问题描述
发现过程
在PR #325 实现 HTTP 客户端认证功能时,发现了一个潜在的架构问题:
HttpInvocationHandler.invoke()方法期望参数数量与应用器数量严格一一对应- 新增的静态鉴权应用器破坏了这个对应关系
- 理论上应该触发
ArrayIndexOutOfBoundsException,但测试暂时没有失败
问题位置
1. HttpInvocationHandler.java 第69-71行
if (args.length != appliers.size()) {
throw new HttpClientException("Args length not equals to appliers size.");
}2. HttpInvocationHandler.java 第81-83行
for (int i = 0; i < appliers.size(); i++) {
appliers.get(i).apply(requestBuilder, args[i]); // 潜在数组越界
}3. AnnotationParser.java 添加额外应用器
- 第110-112行:添加类级别鉴权应用器
- 第125-126行:添加方法级别鉴权应用器
具体分析
问题场景1:无参数方法
@RequestAuth(type = AuthType.API_KEY, name = "X-Service-Key", value = "service-key") // 类级别
public interface TestClient {
@RequestAuth(type = AuthType.BEARER, value = "bearer-token") // 方法级别
@GetMapping("/test")
String test(); // 0个参数
}应用器分析:
- 类级别鉴权应用器:1个
- 方法级别鉴权应用器:1个
- 参数应用器:0个
- 总计:2个应用器,但参数数量为0
预期行为:
- 第69行检查:
0 != 2→ 应该抛出HttpClientException - 如果通过检查,第82行:
args[0]→ 应该抛出ArrayIndexOutOfBoundsException
问题场景2:有参数方法
@RequestAuth(type = AuthType.API_KEY, name = "X-Service-Key", value = "service-key") // 类级别
public interface TestClient {
@GetMapping("/test")
String test(@RequestAuth(type = AuthType.BEARER) String token); // 1个参数,带鉴权注解
}应用器分析:
- 类级别鉴权应用器:1个
- 方法级别鉴权应用器:0个
- 参数应用器:1个(包含@requestauth的参数)
- 总计:2个应用器,但参数数量为1
预期行为:
- 第69行检查:
1 != 2→ 应该抛出HttpClientException - 如果通过检查,第82行当
i=1时:args[1]→ 应该抛出ArrayIndexOutOfBoundsException
当前状态
- 新功能的测试用例包含了上述场景
- 测试执行时没有报错
- 功能表现正常
重现步骤
- 检出分支
fit-enhancement-http-client2 - 运行测试:
cd examples/fit-example/07-http-client-proxy mvn test
- 或启动服务器并运行测试脚本:
mvn spring-boot:run -pl plugin-http-server & ./run_tests.sh
预期行为
根据 HttpInvocationHandler 的设计,应该在参数数量与应用器数量不匹配时抛出异常。
实际行为
测试正常执行,没有抛出预期的异常。
影响分析
潜在风险
- 数组越界风险:如果问题未被检测到,可能在特定条件下触发运行时异常
- 架构不一致:破坏了参数-应用器一一对应的设计原则
- 维护困难:未来添加新功能时可能遇到同样的问题
- 测试盲区:当前测试可能没有覆盖到真实的执行路径
紧急程度
- 优先级:高
- 原因:涉及核心架构的一致性和运行时稳定性
需要调查的问题
-
根因分析:为什么测试没有触发预期的异常?
- 是否存在其他代码路径绕过了检查?
- 是否有异常被捕获并忽略?
- 是否存在JVM级别的保护机制?
-
影响范围:这个问题是否影响其他现有功能?
-
修复策略:如何在不破坏现有功能的前提下修复这个问题?
环境信息
- 分支:fit-enhancement-http-client2
- 相关文件:
HttpInvocationHandler.javaAnnotationParser.javaStaticAuthApplier.java
- 测试用例:
TestAuthClient.java
标签建议
type: bugin: fitpriority: hightheme: architecture
Reactions are currently unavailable