不安全的 C 函数及其替换

2024-01-16

如果我错了,请纠正我,我在网站上进行了研究,但找不到针对此问题的任何综合帖子。 C 中有许多不安全函数可能导致缓冲区溢出,并且有安全函数来替代它们。我有几个:

  • gets()=== 替换为===fgets()
  • sprintf()=== 替换为 === ?
  • strcat()=== 替换为 === ?
  • strcpy()=== 替换为===strncpy()
  • vsprintf()=== 替换为===vsnprintf()

另外,我坚持使用下面的不安全字节复制和不安全字节输入代码。我该如何解决这些问题? 为什么这段代码存在漏洞?

int copy_buf (char *to, int pos, char *from, int len)
{
    int i;
    for (i=0;i<len;<i++){
         to[pos] = from [i];
         pos++;
    }
    return pos
}

对于字节输入,是fread()不安全功能?为什么这里会发生缓冲区溢出呢?

short read_chunk(FILE fil, char *to)
{
    short len;
    fread(&len, 2, 1, fil);
    fread(to, 1, len, fil);
    return len;
}

以下是一些不安全的 C 函数及其替换的新函数的列表

  • strcpy -> strncpy -> strlcpy/strcpy_s
  • strcat -> strncat -> strlcat/strcat_s -strtok
  • sprintf -> snprintf
  • vsprintf -> vsnprintf
  • 获取 -> fgets/gets_s
  • makepath -> _makepath_s (MSDN)
  • _splitpath -> _splitpath_s (MSDN)
  • scanf/sscanf -> sscanf_s (MSDN)
  • snscanf -> _snscanf_s (MSDN)
  • strlen -> strnlen_s (MSDN)

某些函数无论如何使用都会以危险的方式运行。此类功能的实现通常没有考虑安全问题。 gets() 函数不安全,因为它不会对其输入的大小执行边界检查。

攻击者可以轻松地将任意大小的输入发送到 gets() 并溢出目标缓冲区。同样,在读入静态分配的字符数组时使用 >> 运算符也是不安全的,因为它不会对其输入的大小执行边界检查。攻击者可以轻松地将任意大小的输入发送到 >> 运算符并溢出目标缓冲区。

下面的代码调用 gets() 将信息读入缓冲区。

char buf[24];
printf("Please enter your name and press <Enter>\n");
gets(buf);
...
}

然而,程序员使用的函数 gets() 本质上是不安全的,因为它盲目地将所有输入从 STDIN 复制到缓冲区而不检查大小。这允许用户提供大于缓冲区大小的字符串,从而导致溢出情况

您可以在此处进一步阅读有关 C/C++ 中的危险的更多信息。

  1. http://www.dwheeler.com/secure-class/Secure-Programs-HOWTO/dangers-c.html http://www.dwheeler.com/secure-class/Secure-Programs-HOWTO/dangers-c.html
  2. http://www.dwheeler.com/secure-programs/ http://www.dwheeler.com/secure-programs/
  3. http://courses.cs.washington.edu/courses/cse341/04wi/lectures/26-unsafe-languages.html http://courses.cs.washington.edu/courses/cse341/04wi/lectures/26-unsafe-languages.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不安全的 C 函数及其替换 的相关文章

随机推荐