我正在編寫一個小的C代碼來接收一些用戶輸入,這將是一個字符串。現在我讀了很多地方,使用gets()會非常不安全,因爲它可能導致緩衝區溢出攻擊。而在大多數地方,我發現作爲一種替代方法是使用fgets(),而就緩衝區溢出而言更安全。調整gets()以避免緩衝區溢出
現在我有一個問題場景,我不知道之前的緩衝區大小。它不能確定。它可能是任何東西。所以在這種情況下,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 */
那麼gets()的上述用法仍然存在緩衝區溢出問題?因爲在上面我們沒有首先聲明一個固定大小的緩衝區......所以沒有緩衝區溢出是我所期望的。
如果我錯過了某些東西,請糾正我!
確實沒有緩衝區溢出。 'gets()'將字符串存儲在'NULL'處將會受到傷害。 – Quentin
只要說** NO **到'gets()'並且繼續你的生活。僅供參考:自2011年12月以來,'gets()'不再是C語言的一部分(一些C2011編譯器將其作爲擴展提供;其他編譯器可能不兼容C2011)。 – pmg
因爲使用動態數組(char * temp_buffer_to_hold_user_input = NULL;),所以不會發生緩衝區溢出問題。我認爲沒有必要將i/p存儲到另一個陣列。 – Sathish