You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言手动设置NUL终止符调用字符串函数处理HTTP请求是否安全

结论

这个实现方案不安全,存在多个风险点:

已遗漏的风险点

  • 有效数据被篡改:你直接将缓冲区最后一个字节强制设为0,如果readHTTPRequest刚好读满了1024字节的有效数据,会直接覆盖最后1个字节的原始内容。如果\r\n\r\n分隔符刚好落在缓冲区末尾的4字节区域,覆盖操作会破坏分隔符,导致strstr匹配失败,业务逻辑出错。
  • 嵌入NUL字符导致匹配失效:虽然你预期接收的是文本数据,但攻击者可以构造携带\0的恶意请求,strstr遇到\0就会停止遍历,若\r\n\r\n落在第一个\0之后,会完全无法匹配,导致请求体解析失败。
  • 请求体长度计算错误:strlen(request_body)统计的是从request_body起始到第一个\0的长度,这个值完全不等于请求体的真实长度:如果缓冲区被读满,你手动加的\0会导致长度被截断;如果请求体本身携带\0,统计的长度会比真实值小,后续基于这个长度做业务处理会出现数据不完整、逻辑异常的问题。
  • 无错误处理逻辑:你没有判断readHTTPRequest的调用结果,如果接口调用失败、读取字节数为0,缓冲区里是未初始化的垃圾数据,后续strstr可能匹配到随机的垃圾内容,导致不可预期的逻辑错误。

优化建议

  • 先获取readHTTPRequest返回的实际读取字节数n,仅在n < sizeof(buffer)时,在buffer[n]位置设置NUL终止符,避免覆盖有效数据;如果n == sizeof(buffer),说明请求长度超过缓冲区容量,需要按截断场景单独处理。
  • 替换strstr为memmem进行分隔符匹配,直接基于实际读取的字节数做内存匹配,不需要依赖NUL终止符,也能兼容请求中嵌入\0的场景,示例参考:
// 假设readHTTPRequest返回实际读取的字节数,失败返回负值
ssize_t n = readHTTPRequest(buffer, sizeof(buffer));
if (n <= 0) {
    // 处理读取出错/连接关闭逻辑
    return;
}
const char *request_body = memmem(buffer, n, "\r\n\r\n", 4);
if (request_body) {
    // 减去分隔符自身4字节长度,得到真实请求体长度
    size_t request_body_size = n - (request_body - buffer) - 4;
}

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:09