【发布时间】:2010-11-19 23:31:53
【问题描述】:
我看到在我正在处理的一些代码中使用这种模式连接到一个字符串:
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
我相当肯定它是不安全的 C。你会注意到 buffer 既是输出又是第一个输入。
除了缓冲区溢出的明显可能性,我相信不能保证缓冲区在函数的开始和结束之间不会改变(即,不能保证到函数执行期间缓冲区的状态)。 sprintf 的签名还指定目标字符串为restricted。
我还记得一个关于speculative writing in memcpy 的报告,我看不出为什么某些 C 库可能会在 sprintf 中做同样的事情。当然,在这种情况下,它将写入其源。那么这种行为安全吗?
仅供参考,我建议:
char *bufEnd = buffer + strlen(buffer);
/* sprintf returns the number of f'd and print'd into the s */
bufEnd += sprintf(bufEnd, " <input type='file' name='%s' />\r\n", id);
替换这个。
【问题讨论】:
-
即使它是安全(不会崩溃等),我可以想象它会产生与预期不同的结果。
-
@AndrewMedico 怎么样?