假设我有一些遗留代码,这些代码是使用对C STL函数(如strcpy
)的不安全调用编写的。我们都知道strcpy
是不安全的,因为它使程序容易受到缓冲区溢出问题的影响。假设我想将对strcpy
的所有调用替换为对strncpy
的调用。替换对strcpy(dest, src)
的所有调用的技术包括用参数(dest, src, length of dest - 1)
调用strncpy
,然后用\0
终止dest
。我知道问题在于,我们并不总是知道dest
的长度,因为它可能是一个指向堆上分配的内存的指针。
让我们假设我可以计算出每个调用站点的dest
长度。我可以将对strcpy
的所有调用替换为对strncpy
的调用,这将保证我的程序不受缓冲区溢出攻击的影响(至少避免不正确地使用strcpy
)。但是,这种方法可能会悄悄地截断数据,并以一种不受欢迎的方式改变程序行为。这比检测截断和中止程序更好吗?还是允许截断但也记录它更好?
我是从对开发自动修复遗留代码的方法感兴趣的人的角度来问的。有没有人对如何最好地处理这个问题有任何想法?
发布于 2013-11-14 17:49:33
我们都知道
strcpy
是不安全的,因为它使程序容易受到缓冲区溢出问题的影响。
这一点都不是strcpy
的错误:程序员应该确保字符串符合他们的缓冲区,例如,在复制之前调用strlen
,或者确保传入的字符串不可能比缓冲区长。
假设我想将对
strcpy
的所有调用替换为对strncpy
的调用
您不应该这样做,除非您使用的是固定大小的字符串:请记住,strncpy
不仅复制到终止空,而且还用空字节填充字符串的其余部分。如果您正在寻找strcpy
的“现代替代品”,请考虑使用strlcpy
。
这种方法可能会悄悄地截断数据,并以一种不受欢迎的方式改变程序行为。这比检测截断和中止程序更好吗?还是允许截断但也记录它更好?
这完全取决于你。这取决于您的设计中发生这种截断的位置:如果在向web服务发送身份验证信息的代码中发生这种情况,则最好立即停止该进程;如果在将跟踪消息写入日志的代码中发生这种情况,则忽略该问题或将其记录并继续进行可能是可以的。遗憾的是,您不能自动决定它,因为需要一定程度的程序理解。
发布于 2013-11-14 17:50:53
strncpy不是STL函数。:)C没有STL库。我不认为把所有的strcpy替换为strncpy是个好主意。应根据具体情况采取不同的做法。在大多数情况下,使用strcpy就足够了。
https://stackoverflow.com/questions/19984535
复制相似问题