From a4f184bd21d5acba07e7971f1613b99088104b38 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 09:36:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84intention=E5=8C=85=E6=84=8F?= =?UTF-8?q?=E5=A4=96=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 29 +++++++++++-------- .../plugin/user/BukkitServerPlayer.java | 5 ++++ .../plugin/user/FakeBukkitServerPlayer.java | 4 +++ .../core/plugin/network/NetWorkUser.java | 2 ++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index ab216e841..3617b243a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -2142,19 +2142,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener { @Override public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { FriendlyByteBuf buf = event.getBuffer(); - int protocolVersion = buf.readVarInt(); - buf.readUtf(); // serverAddress - buf.readUnsignedShort(); // serverPort - ConnectionState nextState = switch (buf.readVarInt()) { - case 1 -> ConnectionState.STATUS; - case 2, 3 -> ConnectionState.LOGIN; - default -> null; - }; + int protocolVersion; + ConnectionState nextState; + try { + protocolVersion = buf.readVarInt(); + buf.readUtf(); // serverAddress + buf.readUnsignedShort(); // serverPort + nextState = switch (buf.readVarInt()) { + case 1 -> ConnectionState.STATUS; + case 2, 3 -> ConnectionState.LOGIN; + default -> null; + }; + } catch (Throwable e) { // 客户端乱发包 + Debugger.COMMON.warn(() -> "Failed to read intention packet", e); + user.forceDisconnect(); + return; + } if (nextState == null) { // 如果乱发包直接强行断开连接 - Channel channel = user.nettyChannel(); - if (channel != null) { - channel.pipeline().disconnect(); - } + user.forceDisconnect(); return; } if (BukkitNetworkManager.instance.hasViaVersion) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 8348b311d..ea4192b42 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -506,6 +506,11 @@ public class BukkitServerPlayer extends Player { } } + @Override + public void forceDisconnect() { + this.nettyChannel().pipeline().disconnect(); + } + @Override public ConnectionState decoderState() { return decoderState; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java index d4bef6ccf..2b6b7a5ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java @@ -25,6 +25,10 @@ public class FakeBukkitServerPlayer extends BukkitServerPlayer { public void kick(Component message) { } + @Override + public void forceDisconnect() { + } + @Override public boolean isFakePlayer() { return true; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index e925eb355..df46bdf4d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -58,6 +58,8 @@ public interface NetWorkUser { void kick(Component message); + void forceDisconnect(); + void simulatePacket(Object packet); @ApiStatus.Internal