Предотвращение фальсификации сообщения на основе длины? - PullRequest
0 голосов
/ 02 марта 2019

Для моего сетевого приложения на основе 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 МБ на пакет, все, что выше, будет отбрасывать клиента и блокировать его), но есть ли более «стандартные» решения, которые не кажутся такими хакерскими?

1 Ответ

0 голосов
/ 03 марта 2019

Поскольку вы не можете запретить клиенту отправлять данные, которые вы считаете недействительными, вы должны проверить, являются ли эти данные недействительными.Это включает в себя ограничение длины кадра (и, следовательно, значения префикса длины) до максимального размера, ожидаемого от не вредоносного клиента.Если аутентификация является частью протокола, было бы даже лучше иметь два ограничения: небольшое ограничение для неаутентифицированных клиентов, которые должны просто разрешать размеры кадров, необходимые для аутентификации, и затем большее ограничение для аутентифицированных клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...