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 | 低危险 | 确保缓冲区大小与它所说的一样大。 |