代码之家  ›  专栏  ›  技术社区  ›  DoubleVoid

防止基于长度的消息帧篡改?

  •  0
  • DoubleVoid  · 技术社区  · 5 年前

    对于基于TCP的网络应用程序,我使用基于长度的消息帧传输数据。很简单,一个包是这样的:

    [Length][Data]
    

    长度是一个Int32,告诉我即将到来的原始数据的长度。

    byte array 这样地:

    //Read Int
    activePacketLength = (Int32)(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24));
    packetBuffer = new byte[activePacketLength]; //Create buffer
    

    0xFF 0xFF 0xFF 0x7F 0x01 0x02 0x03 ... {and so on}
    

    我的代码将创建一个新的 大小为 int.MaxValue (~2GB)并将读取数据,直到我得到 OutOfMemoryException 大概。。。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Steffen Ullrich    5 年前

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