C语言代码异常跳过RequestCounter累加语句 运行结果不符合预期
问题根因
- 循环变量未初始化:
for(int z; z < UsernameSize; z++)中的局部变量z未赋值,初始值为栈内存随机垃圾值,循环次数不可控,直接导致Request数组越界写入。 - 用户名长度计算错误:
UsernameSize = sizeof(Username);取的是整个数组的固定长度255,而非从文件读取到的用户名实际长度,应该用strlen(Username)获取实际长度。 - 数组越界篡改全局变量:
Request数组仅定义了255字节长度,初始化的curl固定字符串已经占用了104字节,再写入255字节的内容必然越界,越界写入的数据会直接覆盖内存中相邻存储的RequestCounter、UsernameSize等全局变量的值,这就是你观察到累加语句没生效、变量值异常跳变的核心原因。 - 补充隐患:未判断
fopen返回值,文件不存在时会直接崩溃;fscanf未限制读取长度容易溢出;printf(Request)直接将用户可控内容作为格式串,存在格式化注入风险。
修复后代码
#include <stdio.h> #include <string.h> int UsernameSize; int RequestCounter=104; char Username[255]; // 扩大数组长度避免溢出 char Request[1024]="curl -X POST https://api.test.com/profiles/test -H 'Content-Type: application/json' --data-raw '['"; FILE *UsernamesFile; int main() { UsernamesFile = fopen("Usernames.text","r"); if (UsernamesFile == NULL) { printf("文件打开失败\n"); return 1; } // 限制读取长度避免Username溢出 fscanf(UsernamesFile, "%254s", Username); // 取用户名实际长度 UsernameSize = strlen(Username); Request[RequestCounter]='"'; RequestCounter++; // 初始化循环变量z为0 for(int z=0; z < UsernameSize; z++) { Request[RequestCounter+z]=Username[z]; } RequestCounter=RequestCounter+UsernameSize; Request[RequestCounter]='"'; // 避免格式化注入 printf("%s\n", Request); printf("%d\n",RequestCounter); fclose(UsernamesFile); return 0; }
内容的提问来源于stack exchange,提问作者sumfoxdude
相关产品推荐
相关产品推荐

