对于基于TCP的网络应用程序,我正在使用基于长度的消息帧传输数据。很简单,数据包看起来像这样:
[Length][Data]
Length是一个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
(约2GB),并将读取数据,直到我得到OutOfMemoryException
为止……
防止这种回火的好方法是什么?我可以实施大小限制(例如,每个数据包1MB,高于此限制的所有数据都会丢弃客户端并阻止它),但是还有更多的“标准”解决方案不那么笨拙吗?
答案 0 :(得分:1)
由于无法阻止客户端发送数据,因此您认为无效,因此必须检查数据是否无效。这包括将帧的长度(以及长度前缀的值)限制为非恶意客户端期望的最大大小。如果身份验证是协议的一部分,则最好有两个限制:对于未身份验证的客户端,有一个小的限制,应该只允许身份验证所需的帧大小,然后对身份验证的客户端设置更大的限制。