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

如何验证接收到的字节数组的长度,它不是以空结尾的?

  •  1
  • rkellerm  · 技术社区  · 15 年前

    我有一个C + C++代码,通过这种形式在网络上接收一个结构:

    struct DataStruct
    {
    int DataLen;
    BYTE* Data;
    }
    

    我已经查过的密码 Data 在一个循环中 DataLen 时间和处理数据。

    ……问题:

    在代码提交给安全专家进行渗透测试之后,他们准备了一个假应用程序,用它发送这个结构 数据仓库 比实际长度大 数据 . 当然,这会导致访问冲突异常。

    所以,问题是-我如何验证接收的实际长度 数据 ?可以不改变结构吗?

    事先谢谢。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Cubbi    15 年前

    很好的安全专家!我希望我的公司有一个这样的部门。

    无论何时从网络接收数据,网络IO都会报告实际写入缓冲区的字节数,无论您是否使用 read(2) , recv(2) boost::asio::async_read 或者其他我见过的东西。典型的用例是,当数据结构的头中有一个“要跟随的字节数”字段时,重复调用read/recv/etc,直到收到多个字节(或直到出现错误),然后才应该构造并返回数据结构(或报告错误)。

        2
  •  2
  •   Kirill V. Lyadvinsky    15 年前

    你知道你收到了多少字节,所以把它和 DataLen .

        3
  •  1
  •   Alex F    15 年前

    不改变结构是不可能的。从TCP/IP套接字接收的数据是纯流。逻辑上,它不分为数据包。物理数据包可以包含一个或多个数据结构实例,一个数据结构实例可以划分为两个或多个物理数据包。只有在没有通信错误或数据包无效的情况下,才能使用当前的信息结构。

        4
  •  0
  •   levif    15 年前

    如果你没有任何内在的限制,腐败是容易的。

    一些保护机制是:

    • 尝试 realloc() 缓冲器,在可接受的尺寸范围内(如果 Data 是动态的)
    • 例外情况 朋友:使用 SIGSEGV 在里面 signal(2) , signal(7) setjmp(2) 做一些有用的事 尝试/捕捉 代码结构。见 Combining setjmp()/longjmp() and Signal Handling 有关此主题的快速介绍。使用 sigaction(2) 更深入(通过获取错误的地址;)。