qre*_*0ct 0 c string malloc gets fgets
我正在编写一个小的C代码来获取一些用户输入,这将是一个字符串.现在我在许多地方读到使用gets()将非常不安全,因为它可能导致缓冲区溢出攻击.在大多数地方,我发现替代方法是使用fgets(),就缓冲区溢出而言,这更安全.
现在我有一个问题场景,我不知道手前的缓冲区大小.它只是无法确定.它可能是任何东西.所以在这种情况下,fgets()会派上用场吗?
另外,如果我使用gets(),如下所示,解决这个问题有什么问题呢?
char * temp_buffer_to_hold_user_input = NULL;
cahr * actual_buffer_that_stores_user_input = NULL;
int length_of_user_input =0;
/* taking user input, irrespective of its length using gets() */
gets(temp_buffer_to_hold_user_input);
/* now finding the length of the user input string and allocating the required number of bytes for proper (safe) usage */
length_of_user_input=length(temp_buffer_to_hold_user_input);
actual_buffer_that_stores_user_input = (char*)malloc(length_of_user_input*sizeof(char));
strcpy(actual_buffer_that_stores_user_input, temp_buffer_to_hold_user_input);
/* and now we work with our actual buffer */
Run Code Online (Sandbox Code Playgroud)
那么gets()的上述用法是否还有缓冲区溢出问题?因为,在上面我们根本没有声明一个固定大小的缓冲区......所以没有缓冲区溢出是我所期待的.
如果我错过了什么,请纠正我!
char * temp_buffer_to_hold_user_input = NULL;
Run Code Online (Sandbox Code Playgroud)
您将指针设置为NULL.因此,根本没有缓冲区,并且gets会因未定义的行为而失败(实际上可能是分段错误).
gets要求您提供指向缓冲区的有效指针.空指针不指向任何内容,因此不满足此前提条件.由于所有缓冲区都具有有限长度且用户输入长度未知,因此根本无法避免潜在的缓冲区溢出(更不用说安全风险)了.它gets已经从官方标准中删除了.
正确的方法是使用fgets.处理可变大小的输入虽然很棘手,但您有两个选择:
fgets"足够大的所有情况"缓冲区大小.简单的出路.最糟糕的情况是你失去了一些投入.fgets并连接到一些动态分配的数组(并且不要忘记根据需要调整此数组的大小!),直到到达分隔符. 注意:根据您对字符串的操作,您甚至可能不需要保留整个内容,这简化了操作.