gpt4 book ai didi

c - 如何安全地从 C 中的数据包中读取数据?

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:02 24 4
gpt4 key购买 nike

如何从 C 中的数据包中读取数据并将其转换为结构?我的意思是,有一个像

这样的结构
|=======================================================================
|0123456701234567012345670123456701234567012345670123456701234567.......
| type | length | MSG HDR | data

进入类似的结构

struct msg {
char type;
size_t length;
int hdr;
struct data * data;
};

下面的代码可以吗?

bool parse_packet(char * packet, size_t packet_len, struct msg * result) {
if(packet_len < 5) return false;
result->type = *packet++;
result->length = ntohl(*(int*)packet);
packet+=4;
if(result->length + 4 + 5 > packet_len)
return false;
if(result->length < 2)
return false;
result->hdr = ntohs(*(short*)packet);
packet+=2;
return parse_data(result, packet);
}

最佳答案

通常最好检查 packetresult是非空的。

你为什么要检查 packet_len < 5当 header 为 7 个字节时?为什么不只确保数据包至少为 7 个字节并结束它呢?或者是 hdr某些人不存在 type

我不确定你想用什么来实现

if(result->length + 4 + 5 > packet_len)
result->hdr = ntohs(*(short*)packet);
packet+=2;

如果声明的消息长度加九大于接收到的消息长度,则从消息中再读取两个字节。然后不管数据的长度如何,你将两个加到指针上并尝试从中解析出一些东西。如果packet_len怎么办是 5 和 result->length是 4294967295 吗?您将读取缓冲区的末尾,就像在 Heartbleed 中一样。您需要始终验证您的读取是否在边界内,并且永远不要相信数据包中声明的大小。

关于c - 如何安全地从 C 中的数据包中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com