用strncpy替换strcpy

Rou*_*per 4 c c++ security stl strcpy

假设我有一些遗留代码是使用对C STL函数的不安全调用编写的strcpy.我们都知道这strcpy是不安全的,因为它使程序容易受到缓冲区溢出问题的影响.假设我要将所有调用替换为strcpy调用strncpy.一种用于替换所有技术调用strcpy(dest, src)将涉及调用strncpy与参数(dest, src, length of dest - 1),然后终止dest\0.我知道这个问题是我们并不总是知道它的长度,dest因为它可能是指向堆上分配的内存的指针.

我们假设我可以计算出dest每个呼叫站点的长度.我可以取代所有调用strcpy与调用strncpy,这将保证我的计划是不受缓冲区溢出攻击(至少从使用不当的strcpy).但是,这种方法可能会以不合需要的方式默默地截断数据并改变程序行为.这比检测截断和中止程序更好吗?或者是允许截断还是记录它更好吗?

我是从有兴趣开发修补遗留代码的自动方法的人的角度问的.有没有人对如何最好地解决这个问题有任何想法?

das*_*ght 6

我们都知道这strcpy是不安全的,因为它使程序容易受到缓冲区溢出问题的影响.

这不是strcpy最轻微的错误:程序员需要确保字符串适合其缓冲区,例如,通过strlen在复制之前调用,或确保进入的字符串不能长于他们的缓冲.

假设我要将所有调用替换为strcpy调用strncpy

除非使用固定大小的字符串,否则不应该这样做:请记住,strncpy不仅要复制到终止空字符串,还要使用空字节填充字符串的其余部分.如果您正在寻找"现代替代品" strcpy,请考虑使用strlcpy.

这种方法可能会以不合需要的方式无声地截断数据并改变程序行为.这比检测截断和中止程序更好吗?或者是允许截断还是记录它更好吗?

这完全取决于你.这取决于您的设计中发生此类截断的位置:如果它发生在将身份验证信息发送到Web服务的代码中,那么最好立即停止该过程; 如果它发生在将跟踪消息写入日志的代码中,则可以忽略该问题,或者记录并继续.遗憾的是,您无法自动决定,因为需要一定程度的程序理解.