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

时间:2012-06-21 19:13:16

标签: c++ c xcode string-formatting

fprintf(pFile,msg.c_str());

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

Format string is not a string literal (potentially insecure)

我假设我收到此警告以防止攻击,msg包含一些像%s这样的东西,它将堆栈流式传输到屏幕,直到它终止为空。在这种情况下,有没有安全的方法来使用fprintf

2 个答案:

答案 0 :(得分:13)

您可以提供格式字符串

fprintf(pFile, "%s", msg.c_str());

或使用fputs

fputs(msg.c_str(), pFile);

答案 1 :(得分:10)

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

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