我想了解为什么strncpy被认为是不安全的。有人能提供相关文档或者使用它的漏洞示例吗?
我想了解为什么strncpy被认为是不安全的。有人能提供相关文档或者使用它的漏洞示例吗?
请查看这个网站,它提供了相当详细的解释。基本上,strncpy()
不需要以NULL结尾,因此容易受到各种漏洞的攻击。
\0
通常写作“NUL”,以避免与“NULL”指针混淆。 - Chris Lutzstrncpy
不比 strcpy
更好。strlcpy
在可用的情况下很有用,在不可用的情况下易于重写。 - chqrlie为了安全地使用strncpy,必须手动将空字符粘贴到结果缓冲区中(第一种方法),或者知道缓冲区以空字符结尾,并将(length-1)传递给strncpy(第二种方法),或者知道缓冲区永远不会被使用任何不会将其长度限制为缓冲区长度的方法来复制(第三种方法)。
需要注意的是,strncpy会在所复制的字符串后面将缓冲区内所有内容填充为零,而其他长度受限的strcpy变体则不会。这可能在某些情况下会影响性能,但在其他情况下会带来安全优势。例如,如果使用strlcpy将“supercalifragilisticexpalidocious”复制到缓冲区中,然后再复制“it”,则缓冲区将包含“it^ercalifragilisticexpalidocious^”(使用“^”表示零字节)。如果将缓冲区复制到固定大小的格式,则多余的数据可能会随之传送。
PS:被接受的答案中链接的 CERT 文档专门用于展示典型的不称职的 strncpy
函数的滥用,作为 strcpy
的“安全”版本而存在的不安全性。这并不意味着 strncpy
本身有什么安全问题。
strcat()
和strncpy()
太容易了,因此禁止在该代码库中使用这些函数。peff
)撰写。gitster
--在提交记录e28daf2中合并)
banned.h
:将strcat()
标记为禁用
strcat()
函数与strcpy()
具有相同的溢出问题。
另外,作为额外的奖励,很容易无意中出现二次方,因为每个后续调用都必须遍历现有字符串。最后一个
strcat()
调用在提交记录f063d38(守护程序:重新生成时使用cld->env_array,2015-09-24,Git 2.7.0)中消失了。
通常,可以使用动态字符串(strbuf
或xstrfmt
)或者如果知道长度受限,则可以使用xsnprintf
来替换strcat()
。