变得有用吗?

时间:2013-03-05 13:54:52

标签: c history standard-library gets

在我看来,人们,特别是在学习C编程语言时,仍然使用gets函数从stdin读取数据。尽管已经从C11标准中删除了 1 ,并且cppreference上的免责声明如下:

  

gets()函数不执行边界检查,因此这样做   函数极易受到缓冲区溢出攻击。这不可以   安全使用(除非程序在一个环境中运行   限制stdin上可能出现的内容。出于这个原因,该功能具有   在C99标准的第三个更正中被弃用   在C11标准中完全删除。 fgets()和gets_s()是   建议更换。

     

永远不要使用gets()。

然而,似乎这不是一个提出更多现代编程哲学的新问题。它会一直被破坏并导致程序崩溃,我看不出“限制stdin上出现的内容的环境”可能意味着什么。

那么,过去曾经有用吗?或者它是什么原因被添加到以前的标准和预标准版本的C?


(1) ...或者至少更改为具有指示要读取的最大长度的附加参数。然而,我询问旧签名,只接收指针。

4 个答案:

答案 0 :(得分:5)

是的,它同时非常有用且“极易受到缓冲区溢出攻击”。

  

它会一直被破坏并导致程序崩溃,我看不出“限制stdin上可能出现的内容的环境”可能意味着什么。

不,gets没有导致程序崩溃。这主要是一个安全问题。您可以阅读缓冲区溢出攻击here

另请参阅此问题:Why is the gets function so dangerous that it should not be used?

答案 1 :(得分:5)

当你看到C早期的残余时,你必须考虑历史背景。

C语言是在70年代设计的。当时,网络系统是常态而非常规,安全性并不像今天那么重要。系统很少使用不受信任的第三方数据。即使他们这样做,也不会被认为是一个很大的风险。信息技术仍处于最早阶段。没有人意识到计算机系统有多敏感。

另一方面,CPU时间非常宝贵。程序必须尽可能高效。

这就是为什么C标准库中的大多数函数都没有绑定检查的原因。性能比安全性具有更高的优先级。当您需要安全性时,您应该在之前验证您的数据将其提供给您的程序。

但是今天在21世纪,所有计算机系统都是相互联系的,所有计算机系统都在不断处理来自不受信任甚至未知来源的信息,黑客是一个十亿美元的产业,安全已成为每个计算机程序的第一优先。

答案 2 :(得分:2)

gets被发明时,很少有程序需要能够接受来自不可靠来源的大量输入。 gets足以满足合作用户的有限输入。该用户通过不在每行上输入太多来提供“限制可能出现的内容的环境”。您可以非常依赖坐在终端上的用户不要在“y / n”提示符中键入数百个字节的数据。如果他们将大型文件传输到您的程序中,那么当您的程序不是为此而设计时,那么它们会得到不好的结果。

必须处理任意输入的程序未使用gets

现在,恶意输入在实践中很常见,并且更具破坏性,因为存在允许攻击者轻松将缓冲区溢出变为优势的工具和技术。训练有素的用户在提示符下打字是一个利基案例。此外,对恶意输入的计算被广泛用作一种好的技术,以确保软件对不是意图作为攻击的意外输入具有鲁棒性。几乎所有程序都可以处理任意输入。所以gets显然是不合适的。

答案 3 :(得分:0)

获取对于原型设计仍然有用。为程序员编写和生成预期结果的速度很快,程序员的目的是解决手头的问题,而不是试图使他或她的程序崩溃。