Для моего сетевого приложения на основе TCP я передаю данные, используя кадрирование сообщений на основе длины.Это довольно просто, пакет выглядит так:
[Length][Data]
Длина - это Int32, указывающая длину предстоящих необработанных данных.
Я читаю Int и создаю byte array
следующим образом:
//Read Int
activePacketLength = (Int32)(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24));
packetBuffer = new byte[activePacketLength]; //Create buffer
Затем я читаю, пока не прочту x байтов.Это работает нормально, но что, если какой-нибудь забавный пользователь отправит мне что-то вроде этого:
0xFF 0xFF 0xFF 0x7F 0x01 0x02 0x03 ... {and so on}
Мой код создаст новый byte array
размером int.MaxValue
(~ 2 ГБ) и будет читать данные доЯ получаю OutOfMemoryException
или около того ...
Какой хороший способ предотвратить это?Я мог бы установить ограничение размера (например, 1 МБ на пакет, все, что выше, будет отбрасывать клиента и блокировать его), но есть ли более «стандартные» решения, которые не кажутся такими хакерскими?