Skip to content

Commit 6b5202f

Browse files
committed
feat: 引入最大报文长度配置,防御恶意报文
1 parent 154a21a commit 6b5202f

3 files changed

Lines changed: 18 additions & 2 deletions

File tree

rpc-core/src/main/java/com/xiaoyu/rpc/core/config/RpcConfig.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class RpcConfig {
3434
private String loadBalancer = "roundrobin";
3535
// 传输层类型
3636
private String transport = "netty";
37+
// 最大报文长度
38+
private Integer maxMessageSize = 8 * 1024 * 1024;
3739

3840
private RpcConfig() {
3941
loadConfig();
@@ -74,10 +76,11 @@ private void loadConfig() {
7476
this.proxyType = (String) rpcConfig.getOrDefault("proxy", "jdk");
7577
this.loadBalancer = (String) rpcConfig.getOrDefault("load-balancer", "roundrobin");
7678
this.transport = (String) rpcConfig.getOrDefault("transport", "netty");
79+
this.maxMessageSize = (Integer) rpcConfig.getOrDefault("max-message-size", 8 * 1024 * 1024);
7780

78-
log.info("配置加载成功: 序列化方式={}, 服务器={}:{},使用的协议={}, 注册中心={}, 代理方式={}, 负载均衡={}, 传输层={}",
81+
log.info("配置加载成功: 序列化方式={}, 服务器={}:{},使用的协议={}, 注册中心={}, 代理方式={}, 负载均衡={}, 传输层={}, 最大报文={}",
7982
serializerType, serverHost, serverPort, protocol, registryAddress, proxyType, loadBalancer,
80-
transport);
83+
transport, maxMessageSize);
8184
} else {
8285
log.warn("配置文件格式错误,使用默认配置");
8386
setDefaultConfig();
@@ -126,6 +129,7 @@ private void setDefaultConfig() {
126129
this.serverHost = "127.0.0.1";
127130
this.protocol = "netty";
128131
this.transport = "netty";
132+
this.maxMessageSize = 8 * 1024 * 1024;
129133
}
130134

131135
/**
@@ -173,6 +177,10 @@ public String getTransport() {
173177
return transport;
174178
}
175179

180+
public Integer getMaxMessageSize() {
181+
return maxMessageSize;
182+
}
183+
176184
@Override
177185
public String toString() {
178186
return "RpcConfig{" +
@@ -185,6 +193,7 @@ public String toString() {
185193
", proxyType='" + proxyType + '\'' +
186194
", loadBalancer='" + loadBalancer + '\'' +
187195
", transport='" + transport + '\'' +
196+
", maxMessageSize=" + maxMessageSize +
188197
'}';
189198
}
190199
}

rpc-core/src/main/resources/rpc-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ rpc:
77
serializer: "protobuf"
88
proxy: "bytebuddy"
99
load-balancer: "roundrobin"
10+
max-message-size: 8388608 # 8MB

rpc-transport-netty/src/main/java/com/xiaoyu/rpc/core/protocol/netty/MyRpcDecoder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
4343

4444
// 4. 读取 Body 长度
4545
int length = in.readInt();
46+
int maxFrameSize = com.xiaoyu.rpc.core.config.RpcConfig.getInstance().getMaxMessageSize();
47+
if (length > maxFrameSize || length < 0) {
48+
log.error("拒绝过大的报文或非法长度: {} bytes, 远程地址: {}", length, ctx.channel().remoteAddress());
49+
ctx.close(); // 直接断开物理连接,防止持续攻击
50+
throw new RuntimeException("拒绝过大的报文: " + length);
51+
}
4652

4753
// 5. 读取 Body 数据
4854
byte[] body = new byte[length];

0 commit comments

Comments
 (0)