Эх сурвалжийг харах

增加网络消息非法性检测,解包失败直接断开连接,并且记录下对方ip

tanghai 8 жил өмнө
parent
commit
8e15603451

+ 1 - 1
Unity/Assets/Scripts/Base/Network/TNet/TBuffer.cs

@@ -75,7 +75,7 @@ namespace Model
 
 		public void RecvFrom(byte[] buffer)
 		{
-			if (this.Count < buffer.Length || buffer.Length == 0)
+			if (this.Count < buffer.Length)
 			{
 				throw new Exception($"bufferList size < n, bufferList: {this.Count} buffer length: {buffer.Length}");
 			}

+ 17 - 3
Unity/Assets/Scripts/Entity/Session.cs

@@ -62,7 +62,9 @@ namespace Model
 
 				if (messageBytes.Length < 3)
 				{
-					continue;
+					Log.Error($"message error length < 3, ip: {this.RemoteAddress}");
+					this.network.Remove(this.Id);
+					return;
 				}
 
 				ushort opcode = BitConverter.ToUInt16(messageBytes, 0);
@@ -97,9 +99,21 @@ namespace Model
 
 		private void RunDecompressedBytes(ushort opcode, byte[] messageBytes, int offset)
 		{
+			object message;
 			Opcode op = (Opcode)opcode;
-			Type messageType = this.network.Entity.GetComponent<OpcodeTypeComponent>().GetType(op);
-			object message = this.network.MessagePacker.DeserializeFrom(messageType, messageBytes, offset, messageBytes.Length - offset);
+
+			try
+			{
+				
+				Type messageType = this.network.Entity.GetComponent<OpcodeTypeComponent>().GetType(op);
+				message = this.network.MessagePacker.DeserializeFrom(messageType, messageBytes, offset, messageBytes.Length - offset);
+			}
+			catch (Exception e)
+			{
+				Log.Error($"message deserialize error, ip: {this.RemoteAddress} {op} {e}");
+				this.network.Remove(this.Id);
+				return;
+			}
 
 			//Log.Debug($"recv: {MongoHelper.ToJson(message)}");