如何从文本文件读取%s、%d等格式说明符供后续printf调用使用
实现方案
你需要的功能完全可以实现,原有代码无法运行主要是基础语法错误和fgets的读取特性导致的,调整后即可达到预期效果。
原有代码的问题点
- 语法笔误:代码中的
charn是拼写错误,C语言标准字符类型为char - 换行符残留:
fgets读取文本行时会将行尾的换行符\n一同存入缓冲区,会导致最终输出多出不必要的换行 - 缺少异常校验:没有判断文件打开、内存分配是否成功,也没有对读取到的格式串做合法性校验,存在安全风险
可运行的实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *f = fopen("/home/foo/bar", "r"); if (f == NULL) { perror("文件打开失败"); return 1; } char *s_buf = malloc(sizeof(char) * 256); if (s_buf == NULL) { perror("内存分配失败"); fclose(f); return 1; } if (fgets(s_buf, 255, f) == NULL) { perror("文件读取失败"); free(s_buf); fclose(f); return 1; } // 移除fgets读取到的末尾换行符 size_t len = strlen(s_buf); if (len > 0 && s_buf[len - 1] == '\n') { s_buf[len - 1] = '\0'; } // 可在此处添加格式串合法性校验,比如检查是否存在%n等危险格式符 printf(s_buf, "bar"); free(s_buf); fclose(f); return 0; }
注意事项
- 只可以读取可信来源的格式串,如果格式串来自外部不可信输入,攻击者可以构造包含
%n、参数不匹配等恶意内容,触发格式化字符串漏洞,导致内存破坏、信息泄露甚至远程代码执行 - 可以提前校验读取到的格式串的格式符类型、数量,和后续传入的参数做匹配,避免参数不匹配导致的未定义行为
内容的提问来源于stack exchange,提问作者Schuasda
相关产品推荐
相关产品推荐

