防止基于长度的消息框架篡改



对于基于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}

我的代码将创建一个具有int.MaxValue(〜2GB)大小的新byte array,并将读取数据,直到我获得OutOfMemoryException左右...

什么是防止这种回火的好方法?我可以实现一个尺寸限制(例如每个数据包1MB,所有内容都高于将客户端丢弃并阻止它),但是是否有更多的"标准"解决方案,这些解决方案不那么骇客?

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

最新更新