防止基于长度的邮件帧篡改?

时间:2019-03-02 17:56:05

标签: c# networking tcp

对于基于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,高于此限制的所有数据都会丢弃客户端并阻止它),但是还有更多的“标准”解决方案不那么笨拙吗?

1 个答案:

答案 0 :(得分:1)

由于无法阻止客户端发送数据,因此您认为无效,因此必须检查数据是否无效。这包括将帧的长度(以及长度前缀的值)限制为非恶意客户端期望的最大大小。如果身份验证是协议的一部分,则最好有两个限制:对于未身份验证的客户端,有一个小的限制,应该只允许身份验证所需的帧大小,然后对身份验证的客户端设置更大的限制。