用strncpy替换strcpy

时间:2013-11-14 17:38:14

标签: c++ c security stl strcpy

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

  

假设我想通过调用strcpy来取代对strncpy的所有来电

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

  

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

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

答案 1 :(得分:1)

strncpy不是STL函数。:) C没有STL库。我不认为将strcpy的所有出现替换为strncpy是个好主意。根据情况,方法应该不同。在大多数情况下,使用strcpy就足够了。