跳到主要内容

C 语言中不安全的函数

在 C 语言中,有一些函数由于缺乏适当的边界检查或容易引发缓冲区溢出等问题,被认为是不安全的。使用这些函数可能会导致安全漏洞,如内存泄漏、程序崩溃或允许攻击者执行恶意代码。

下表列出了 C 语言中不安全的函数及其解决方案。

函数严重性解决方案
1gets最危险使用 fgets(buf, size, stdin)。这几乎总是一个大问题!
2strcpy很危险改为使用 strncpy
3strcat很危险改为使用 strncat
4sprintf很危险改为使用 snprintf,或者使用精度说明符。
5scanf很危险使用精度说明符,或自己进行解析。
6sscanf很危险使用精度说明符,或自己进行解析。
7fscanf很危险使用精度说明符,或自己进行解析。
8vfscanf很危险使用精度说明符,或自己进行解析。
9vsprintf很危险改为使用 vsnprintf,或者使用精度说明符。
10vscanf很危险使用精度说明符,或自己进行解析。
11vsscanf很危险使用精度说明符,或自己进行解析。
12streadd很危险确保分配的目的地参数大小是源参数大小的四倍。
13strecpy很危险确保分配的目的地参数大小是源参数大小的四倍。
14strtrns危险手工检查来查看目的地大小是否至少与源字符串相等。
15realpath很危险(或稍小,取决于实现)分配缓冲区大小为 MAXPATHLEN。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN
16syslog很危险(或稍小,取决于实现)在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。
17getopt很危险(或稍小,取决于实现)在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。
18getopt_long很危险(或稍小,取决于实现)在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。
19getpass很危险(或稍小,取决于实现)在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。
20getchar中等危险如果在循环中使用该函数,确保检查缓冲区边界。
21fgetc中等危险如果在循环中使用该函数,确保检查缓冲区边界。
22getc中等危险如果在循环中使用该函数,确保检查缓冲区边界。
23read中等危险如果在循环中使用该函数,确保检查缓冲区边界。
24bcopy低危险确保缓冲区大小与它所说的一样大。
25fgets低危险确保缓冲区大小与它所说的一样大。
26memcpy低危险确保缓冲区大小与它所说的一样大。
27snprintf低危险确保缓冲区大小与它所说的一样大。
28strccpy低危险确保缓冲区大小与它所说的一样大。
29strcadd低危险确保缓冲区大小与它所说的一样大。
30strncpy低危险确保缓冲区大小与它所说的一样大。
31vsnprintf低危险确保缓冲区大小与它所说的一样大。