为什么我使用fprintf在这个C代码中收到警告?

0x9*_*x90 4 c c++ xcode string-formatting

fprintf(pFile,msg.c_str());
Run Code Online (Sandbox Code Playgroud)

为什么我在Xcode中收到警告:

Format string is not a string literal (potentially insecure)
Run Code Online (Sandbox Code Playgroud)

我假设我得到这个警告,以防止攻击是msg包含一些事情,如%s堆栈到屏幕流,直到它终止为null.fprintf在这种情况下有没有安全的使用方法?

Dan*_*her 13

你可以给一个格式字符串,

fprintf(pFile, "%s", msg.c_str());
Run Code Online (Sandbox Code Playgroud)

或使用fputs,

fputs(msg.c_str(), pFile);
Run Code Online (Sandbox Code Playgroud)


tim*_*mos 10

您的编译器警告您的原因是您打印字符串的方式可能导致称为"格式字符串漏洞利用"的漏洞,如果用户能够以某种方式影响msg的内容到他可以放入他自己的格式说明符的扩展("%n"等).建议的答案(fprintf(pFile,"%s",msg.c_str());)解决了这个问题,因为格式字符串现在是常量.

您可以在此处阅读有关格式字符串漏洞的更多信息:http://julianor.tripod.com/bc/formatstring-1.2.pdf