4
fprintf(pFile,msg.c_str());

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

Format string is not a string literal (potentially insecure)

我假设我收到此警告以防止攻击是 msg 包含一些内容,例如%s将堆栈流到屏幕直到它到达空终止。fprintf在这种情况下有什么安全的使用方法吗?

4

2 回答 2

13

您可以提供格式字符串,

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

或使用fputs

fputs(msg.c_str(), pFile);
于 2012-06-21T19:16:22.617 回答
10

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

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

于 2012-06-21T19:20:55.050 回答