当我使用获取功能时,gcc会给我一个警告:
warning:the `gets' function is dangerous and should not be used.
为什么获取和放置功能很危险?
答案 0 :(得分:47)
如果你有这样的代码:
char s[10];
gets( s );
并且在程序运行时输入超过10个字符,您将溢出缓冲区,从而导致未定义的行为。 gets()函数无法阻止您键入字符,因此应该避免。相反,您应该使用fgets(),它允许您限制读取的字符数,以便缓冲区不会溢出。:
char s[10];
fgets( s, 10, stdin );
puts()函数非常安全,提供您输出的字符串以空值终止。
答案 1 :(得分:4)
因为gets
不会限制它读取的数据量,因此容易受到缓冲区溢出的影响。 @ Neil的答案有适当的解决方案。
puts
函数并不危险,AFAIK,当然,除非您忘记将其终止。
答案 2 :(得分:3)
缓冲区溢出很危险。这是定义:
/* Get a line from the stdin stream. */
char *gets(char *buffer);
缓冲区有多大?如果用户键入了更多可以放入缓冲区的数据,程序可能会崩溃并容易受到黑客利用的影响。
答案 3 :(得分:2)
作为Wikipedia's article says,gets()
本质上是不安全的,因为所需要的只是char *
作为参数。
这很危险,因为该方法无法知道在任何情况下已为char *
分配了多少空间。因此,gets
的行为就像它有一个空白检查,以尽可能多地写入数据,这可能导致缓冲区溢出。
替代方法是fgets
,它不仅包含字符数组,还包含最大长度和流指针。 gets
仅用于向后兼容旧代码。
答案 4 :(得分:1)
获取不会检查缓冲区溢出,从而暴露您的代码以进行攻击
答案 5 :(得分:1)
gets
将数据读入给定的内存区域,直到遇到换行符或文件结尾。如果输入(例如,由用户提供)包含的行长于提供给gets
的缓冲区的大小,则它将溢出并且将写入缓冲区外的内存。在最坏的情况下,这可能允许恶意用户编写改变程序行为的数据,甚至可能使用该程序的特权执行任意代码(例如,可能在远程服务器上运行或具有其他用户的特权的代码),甚至意外溢出都可能破坏软件。
fgets
,因为它需要一个额外的参数来约束输入的大小。