C 语言中不安全的函数
在 C 语言中,有一些函数由于缺乏适当的边界检查或容易引发缓冲区溢出等问题,被认为是不安全的。使用这些函数可能会导致安全漏洞,如内存泄漏、程序崩溃或允许攻击者执行恶意代码。
下表列出了 C 语言中不安全的函数及其解决方案。
函数 | 严重性 | 解决方案 | |
---|---|---|---|
1 | gets | 最危险 | 使用 fgets(buf, size, stdin) 。这几乎总是一个大问题! |
2 | strcpy | 很危险 | 改为使用 strncpy 。 |
3 | strcat | 很危险 | 改为使用 strncat 。 |
4 | sprintf | 很危险 | 改为使用 snprintf ,或者使用精度说明符。 |
5 | scanf | 很危险 | 使用精度说明符,或自己进行解析。 |
6 | sscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
7 | fscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
8 | vfscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
9 | vsprintf | 很危险 | 改为使用 vsnprintf ,或者使用精度说明符。 |
10 | vscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
11 | vsscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
12 | streadd | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
13 | strecpy | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
14 | strtrns | 危险 | 手工检查来查看目的地大小是否至少与源字符串相等。 |
15 | realpath | 很危险(或稍小,取决于实现) | 分配缓冲区大小为 MAXPATHLEN 。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN 。 |
16 | syslog | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
17 | getopt | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
18 | getopt_long | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
19 | getpass | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
20 | getchar | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
21 | fgetc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
22 | getc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
23 | read | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
24 | bcopy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
25 | fgets | 低危险 | 确保缓冲区大小与它所说的一样大。 |
26 | memcpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
27 | snprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
28 | strccpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
29 | strcadd | 低危险 | 确保缓冲区大小与它所说的一样大。 |
30 | strncpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
31 | vsnprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |