我看到使用这种模式来连接到在一些代码字符串我工作:sprintf(buffer,“%s [...]”,buffer,[...])是否安全?
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
和我相当肯定它不是安全C.你会发现buffer
既是输出和第一个输入。
除了很明显的缓冲区溢出的可能性,我相信不能保证缓冲区不会在函数的开始和结束之间发生变化(即,不能保证什么状态的缓冲区将在执行该功能期间)。 sprintf的签名额外指定目标字符串为restrict
ed。
我还记得一个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);
替换此。
即使它*安全*(不会崩溃等)我可以想象它产生的结果不是预期的结果。 – 2009-08-16 03:08:58
@AndrewMedico那是怎么回事? – cat 2016-09-27 21:49:56