当它引入 fgets() 没有的漏洞时,在 c 中使用 gets() 函数的目的是什么?

What is the purpose of having a gets() function in c when it introduces vulnerabilities that fgets() doesn't?

我理解为什么 C 开发人员不使用 gets,因为存在缓冲区溢出攻击可以利用的漏洞,但如果使用 fgets() 更安全,为什么还要使用此函数。我想我要问的问题是,从安全角度来看,gets() 是否有任何安全的含义?

gets 是在 C 语言的早期发明的,大约 50 年前,当时人们还没有想到缓冲区溢出攻击的概念,并且当时假设您的程序的用户会很友好.显然时代变了,回想起来它的设计是一个错误。它不能安全使用,因此根本不应该使用,当前版本的 C 语言标准实际上已经删除了它。参见 Why is the gets function so dangerous that it should not be used?

至于它最初存在的原因,大多数 stdio 函数都有专门的版本,可以在 stdin/stdout 而不是任意流上运行。例如,fprintf 打印到任意流,printf 假定 stdout。同样还有fscanf/scanfgetc/getchar等。主要是为了方便,让大家省去到处打stdout的麻烦

对于 line-based I/O,任意流有 fputs/fgets,stdout/stdin 有 puts/gets。请注意 puts/gets 具有自动 append/strip 换行符的特殊功能,因此 gets(buf) 并不完全等同于 fgets(stdin, buf, INT_MAX).

不完全清楚为什么他们决定 fgets 应该采用大小参数但 gets 不应该。可能有一个隐含的假设,即 stdin 更可能是“不错的”输入,例如终端输入或具有合理行长度的文本文件,而用 fopen 打开的任意文件可能更可能需要极度处理排长队等等。事后看来,原始 C 语言中肯定有很多这样的方面没有经过深思熟虑。