C和C++安全编码(原书第2版)
上QQ阅读APP看书,第一时间看更新

2.2.5 与函数无关的字符串错误

大部分在标准字符串处理库<string.h>中定义的函数都非常容易出错,包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微软Visual Studio已经废弃了许多这样的函数。尽管如此,由于空字符结尾的字符串是用字符数组实现的,因此,完全有可能在不调用任何函数的情况下做了不安全的字符串操作。下面的程序并没有调用任何字符串库函数,然而却包含了一个由字符串复制操作导致的缺陷。


01  int main(int argc, char *argv[]) {
02    int i = 0;
03    char buff[128];
04    char *arg1 = argv[1];
05    if (argc == 0) {
06      puts("No arguments");
07      return EXIT_FAILURE;
08    }
10    while (arg1[i] != '\0') {
11      buff[i] = arg1[i];
12      i++;
13    }
14    buff[i] = '\0';
15    printf("buff = %s\n", buff);
16    exit(EXIT_SUCCESS);
17  }

这个有缺陷的程序接受一个字符串参数,并将其复制到buff字符数组,然后打印buff中的内容。变量buff被声明为一个128个字符长的定长数组。如果提供给程序的第一个参数等于或者超过128个字符(请记住还有结尾的空字符),这个程序就会在数组的边界外进行写操作。

显然,消除对危险函数的使用并不能保证你的程序就能够避免安全缺陷。在接下来的几节中,你将会看到这些安全缺陷是如何导致可被利用的漏洞的。