📜  gets()有使用风险!(1)

📅  最后修改于: 2023-12-03 15:00:54.536000             🧑  作者: Mango

gets()有使用风险!

在C/C++中,gets()函数是比较常用的,也是被用得最多的输入函数。gets()函数用于从标准输入stdin读取一行数据,直到遇到换行符或EOF为止,读取的内容存储到一个字符串指针所指向的字符数组中。

但是,gets()函数存在一定的使用风险。如果用户输入的数据超出了指定字符数组的长度,那么就会导致内存缓冲区溢出的情况,这可能被黑客用来攻击你的程序。

为了防止gets()函数带来的风险,我们建议使用fgets()函数来代替gets()函数。

char str[10];
fgets(str, 10, stdin);

gets()不同,fgets()会接受第二个参数,用于表示读取字符数的最大值。我们可以限制最多只能读取10个字符。这样即使用户输入了一个长度超过10的字符串,程序也不会溢出。

使用fgets()函数还可以更进一步地保障程序的安全性。一些编译器建议把fgets()sscanf()等函数一起使用,以防止格式化字符串(format string)漏洞的出现。这种漏洞可以被黑客用来攻击你的程序。

char str[10];
fgets(str, 10, stdin);
int num;
sscanf(str, "%d", &num);

需要说明的是,fgets()会读取字符串中的换行符,而sscanf()则是用于字符串到数字的转换。在执行转换之前,sscanf()会自动跳过开头的空格,所以即使用户输入了一些空格,也不会对程序运行产生影响。

综上所述,我们应该避免使用gets()函数,而是使用更加安全的fgets()函数来保障程序的安全。