通过 TCP 接收整数时阻止整数 underflow/overflow
Prevent integer underflow/overflow when receiving integer over TCP
举例来说,我有一个 TCP 服务器需要在接收所述数据之前知道一些任意数据的无符号整数 (uint32_t
) 大小。为了接收任意数据,客户端首先必须发送使用 htonl
编码的 uint32_t
无符号整数的大小字节,例如(客户端):
uint32_t size_int = // some size integer calculated before
uint32_t nbo_data = htonl(size_int);
// send nbo_data to server...
要解码字节,服务器将执行以下操作:
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
uint32_t size_int = ntohl(nbo_data);
现在假设攻击者发送了 uint32_t 字节编码的 htonl
超过了 UINT32_MAX
value/4294967295。我怎样才能防止出现整数 overflow/underflow?简单地转换为更大的数据类型,即 long long
和边界检查就足够了吗?像这样:
char receive_buffer[1024];
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
long long size_int = (long long)ntohl(nbo_data);
// Check if size_int > UINT32_MAX or size_int < 0 here
// If true raise error.
或者有更好的approach/is这种方法有缺陷且无效吗?
Now say for instance an attacker sent uint32_t bytes encoded with
htonl
that exceeded the UINT32_MAX
value/4294967295.
如评论中所述,这是不可能的。
htonl()
只是将一个四字节序列转换为另一个,这样生成的序列就是参数值的大端(网络顺序)表示。如果主机本机使用 big-endian 顺序,那么这是一个空操作。
uint32_t
表示一个无符号整数类型,有 32 个值位,没有填充位。此类值的解释由语言规范强制执行,并且它没有为无法解释为 uint32_t
的 32 位模式留出空间。 UINT32_MAX
的值由此而来。
即使通过恶意修改位,对手也无法发送 32 位值,该值不能解释为介于 0 和 UINT32_MAX
之间的 uint32_t
,包括 0 和 UINT32_MAX
。接收到的 uint32_t
也不会导致 ntohl()
尝试 return 一个超出范围的值,因为再一次,类型 [= 不能表达超出范围或无效的值13=].
How could I
prevent an integer overflow/underflow from occurring?
您无需采取任何措施来避免这种情况。相反,您应该关注如何检测或处理收到的值完全错误或不一致的可能性。
举例来说,我有一个 TCP 服务器需要在接收所述数据之前知道一些任意数据的无符号整数 (uint32_t
) 大小。为了接收任意数据,客户端首先必须发送使用 htonl
编码的 uint32_t
无符号整数的大小字节,例如(客户端):
uint32_t size_int = // some size integer calculated before
uint32_t nbo_data = htonl(size_int);
// send nbo_data to server...
要解码字节,服务器将执行以下操作:
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
uint32_t size_int = ntohl(nbo_data);
现在假设攻击者发送了 uint32_t 字节编码的 htonl
超过了 UINT32_MAX
value/4294967295。我怎样才能防止出现整数 overflow/underflow?简单地转换为更大的数据类型,即 long long
和边界检查就足够了吗?像这样:
char receive_buffer[1024];
// First receive nbo_bytes into receive_buffer...
uint32_t nbo_data;
memcpy(&nbo_data, receive_buffer, sizeof(uint32_t));
long long size_int = (long long)ntohl(nbo_data);
// Check if size_int > UINT32_MAX or size_int < 0 here
// If true raise error.
或者有更好的approach/is这种方法有缺陷且无效吗?
Now say for instance an attacker sent uint32_t bytes encoded with
htonl
that exceeded theUINT32_MAX
value/4294967295.
如评论中所述,这是不可能的。
htonl()
只是将一个四字节序列转换为另一个,这样生成的序列就是参数值的大端(网络顺序)表示。如果主机本机使用 big-endian 顺序,那么这是一个空操作。
uint32_t
表示一个无符号整数类型,有 32 个值位,没有填充位。此类值的解释由语言规范强制执行,并且它没有为无法解释为 uint32_t
的 32 位模式留出空间。 UINT32_MAX
的值由此而来。
即使通过恶意修改位,对手也无法发送 32 位值,该值不能解释为介于 0 和 UINT32_MAX
之间的 uint32_t
,包括 0 和 UINT32_MAX
。接收到的 uint32_t
也不会导致 ntohl()
尝试 return 一个超出范围的值,因为再一次,类型 [= 不能表达超出范围或无效的值13=].
How could I prevent an integer overflow/underflow from occurring?
您无需采取任何措施来避免这种情况。相反,您应该关注如何检测或处理收到的值完全错误或不一致的可能性。