为了账号安全,请及时绑定邮箱和手机立即绑定

为什么strlcpy和strlcat被认为是不安全的?

为什么strlcpy和strlcat被认为是不安全的?

心有法竹 2019-06-28 10:49:37
为什么strlcpy和strlcat被认为是不安全的?我明白strlcpy和strlcat的安全替换strncpy和strncat..然而,有些人仍然认为不安全,只会导致另一种类型的问题.有人能给出一个如何使用的例子吗?strlcpy或strlcat(即指总NULL终止其字符串)会导致安全问题吗?乌尔里希·德雷珀和詹姆斯·安蒂尔说这是真的,但永远不要提供例子或澄清这一点。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

首先,strlcpy的安全版本。strncpy(和strncpy的安全版本。strcpy)。这两种功能是完全不相关的。strncpy是一个与C-字符串(即空终止字符串)完全无关的函数。事实上它有str...其名称中的前缀只是一个历史错误。的历史和宗旨strncpy是众所周知的,也是有据可查的。这是一个函数,用于处理一些Unix文件系统的历史版本中使用的所谓“固定宽度”字符串(而不是C-字符串)。今天有些程序员被它的名字弄糊涂了,并且认为strncpy作为有限长度的C-字符串复制函数(“安全”的兄弟姐妹)strcpy),这在现实中完全是胡说八道,导致了糟糕的编程实践。目前形式的C标准库没有任何限制长度C字串复制的功能.这里是strlcpy合身。strlcpy确实是为处理C-字符串而创建的真正的有限长度复制函数。strlcpy正确地完成有限长度的复制函数应该做的所有事情。唯一能针对它的批评是,令人遗憾的是,它不是标准的。

第二,strncat另一方面,它确实是一个与C字符串一起工作并执行有限长度连接的函数(它确实是strcat)。为了正确地使用这个函数,程序员必须特别小心,因为这个函数接受的大小参数实际上不是接收结果的缓冲区的大小,而是其剩余部分的大小(另外,终止符字符被隐式计算)。这可能会让人感到困惑,因为为了将该大小与缓冲区的大小联系起来,程序员必须记住执行一些额外的计算,这通常用于批评strncatstrlcat处理这些问题,更改接口,这样就不需要额外的计算(至少在调用代码中是这样)。再一次,我看到的唯一一个可以批评这一点的基础是,这个功能是不标准的。另外,功能来自strcat由于基于重新扫描的字符串连接的概念的可用性有限,所以在专业代码中经常看不到组。

至于这些功能如何导致安全问题.。它们根本不能导致安全问题,它们不能比C语言本身“导致安全问题”更大程度上导致安全问题。您知道,有相当一段时间,人们强烈认为C+语言必须朝着开发成某种奇怪的Java风格的方向发展。这种情绪有时也会蔓延到C语言领域,导致对C语言特性和C标准库特性的无知和强制批评。我怀疑,在这种情况下,我们可能也在处理类似的事情,尽管我当然希望事情没有那么糟糕。


查看完整回答
反对 回复 2019-06-28
?
ITMISS

TA贡献1871条经验 获得超8个赞

Ulrich的批评是基于这样的观点,即没有被程序检测到的字符串截断会通过不正确的逻辑导致安全问题。因此,为了安全起见,您需要检查截断。要对字符串连接执行此操作,就意味着要按照以下方式进行检查:

if (destlen + sourcelen > dest_maxlen){
    /* Bug out */}

现在,strlcat有效地执行此检查,如果程序员记得检查结果-所以能,会,可以安全使用:

if (strlcat(dest, source, dest_bufferlen) >= dest_bufferlen){
    /* Bug out */}

乌尔里希的观点是既然你必须destlensourcelen(或重新计算它们,这就是strlcat),您最好使用更高效的memcpy总之:

if (destlen + sourcelen > dest_maxlen){
    goto error_out;}memcpy(dest + destlen, source, sourcelen + 1);destlen += sourcelen;

(在上述代码中,dest_maxlen中存储的字符串的最大长度。dest-比dest缓冲器。dest_bufferlendest buffer).


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 1416 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信