C 它有用吗?

C 它有用吗?,c,history,standard-library,gets,C,History,Standard Library,Gets,在我看来,人们,尤其是在学习C编程语言时,仍然在使用该函数从stdin读取数据。尽管它现在已从C11标准中删除,但其免责声明如下: gets()函数不执行边界检查,因此 函数极易受到缓冲区溢出攻击。它不能 安全使用(除非程序运行在 限制可以在标准输入上显示的内容)。因此,该函数具有 C99标准第三次勘误表中已弃用,且 在C11标准中完全删除。fgets()和get_s()是 建议更换 永远不要使用get() 然而,这似乎不是一个新的问题,它提出了更现代的编程哲学。它总是会被破坏,导致程序崩溃,我

在我看来,人们,尤其是在学习C编程语言时,仍然在使用该函数从stdin读取数据。尽管它现在已从C11标准中删除,但其免责声明如下:

gets()函数不执行边界检查,因此 函数极易受到缓冲区溢出攻击。它不能 安全使用(除非程序运行在 限制可以在标准输入上显示的内容)。因此,该函数具有 C99标准第三次勘误表中已弃用,且 在C11标准中完全删除。fgets()和get_s()是 建议更换

永远不要使用get()


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

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


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

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


它总是会被破坏,导致程序崩溃,我不明白“限制stdin上可能出现的内容的环境”可能意味着什么

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


还可以看到这个问题:

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

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

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

另一方面,CPU时间非常宝贵。项目需要尽可能高效

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


但在21世纪的今天,所有的计算机系统都是相互连接的,所有的计算机系统都在不断地处理来自不可信甚至未知来源的信息,黑客是一个价值数十亿美元的行业,安全性已经成为每一个计算机程序的首要任务。

被发明时,很少有程序需要能够接受来自不可信来源的大量输入<代码>获取
对于合作用户的有限输入是足够的。该用户通过不在每行上键入太多内容来提供“限制显示内容的环境”。您几乎可以指望坐在终端旁的用户不会在“y/n”提示符中键入数百字节的数据。如果他们用管道将一个大文件传输到你的程序中,而你的程序不是为此而设计的,那么,他们会得到糟糕的结果

必须处理任意输入的程序没有使用
get


现在,恶意输入在实践中很常见,而且更具破坏性,因为存在允许攻击者轻松利用缓冲区溢出的工具和技术。一个训练有素的用户在提示下打字就是一个很好的例子。此外,考虑恶意输入被广泛用作一种很好的技术,以确保软件对非预期攻击的意外输入具有鲁棒性。几乎所有的程序都需要处理任意输入。因此,
get
显然是不够的。

从“你应该只问基于你所面临的实际问题的实际的、可回答的问题…”(我的重点).@T.J.Crowder-它还说“编程职业特有的问题”,你不会问编程之外的API使用问题profession@Mike:是的,但我将
&
应用于这些标准。您似乎正在应用
|
:-)这里没有“实际问题”。我没有制定规则,所以(如果我有,那将是一个不同的地方),我只是指出它们。“限制stdin上可能出现的内容的环境”意味着,使用终端的人知道,他不能输入超过,他认为/猜测的是字符数组大小,在程序中使用……如果用“什么是<代码>变得实用?”这句话可能是一个更好的问题。目前,如果不定义“有用”,就无法回答,并且可能引发辩论、争论或广泛讨论。如果你想重新回答这个问题,它需要事实上的回答。正如OP中暗示的,这些都是矛盾。如果我通过调用
gets
使我的程序暴露在缓冲区溢出中,那么它显然是无用的。问题是,以前是否有额外的保护措施,如果没有,为什么
get
被定义为原来的样子。@bitmask对我来说“有用”意味着它可以帮助用户实现一些有用的功能。一个程序既有用又不安全…C是70年代设计的。当时,网络化系统是一个例外,而安全性并没有今天那么重要。数据通常被认为与数据一样可信