2010-08-04 74 views
1

我是C新手,想知道指針是否可能被像strcpy()這樣的脆弱c函數溢出。我在源代碼中看到了很多,它是避免緩衝區溢出的一種方法嗎?字符指針溢出

回答

1

是的。這實際上是緩衝區溢出漏洞的經典原因。避免溢出緩衝區的唯一方法是確保您不會做任何可能導致溢出的操作。在strcpy的情況下,解決方案是使用strncpy,其中包括要將字符串複製到的緩衝區的大小。

+2

'strncpy'沒有什麼幫助,因爲如果在目標中沒有空間來終止空字符,那麼就不會在那裏放置(即如果源比目標大小更長)。有些人提供比實際目的地大小少的人。 – dreamlax 2010-08-04 23:10:42

+0

'strncpy'的API使它很容易使用它,我發現它很多次都使用不正確。我不知道人們爲什麼如此害怕計算緩衝區大小,分配內存和使用原始函數...... – Thanatos 2010-08-05 03:52:55

+0

@Thanatos:在這種情況下,當你從用戶接收緩衝區時,你會做什麼?你甚至不能安全地調用'strlen',它可能不會被NUL終止。 – torak 2010-08-05 12:18:30

1

當然,如果你不爲緩衝區分配足夠的空間,那麼你當然可以:

char* ptr = (char*)malloc(3); 
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */ 

然而,什麼是真正糟糕的是,這種代碼可以不給你任何錯誤的工作,但它可能在某處覆蓋一些內存可能會導致您的程序在稍後發生,看似隨機發生,您可能不知道爲什麼。這些是時間的來源(有時甚至是)的沮喪,誰花了任何大量的時間寫作C會告訴你。

這就是爲什麼與C,你必須非常小心這種事情,和雙,三,第n度檢查你的代碼。之後,再次檢查。

0

一些其他的方法是

#define MAX_LENGTH_NAME 256 

foo() 
{ 
char a[MAX_LENGTH_NAME+1]; // You can also use malloc here 

strncpy(a,"Foxy",MAX_LENGTH_NAME); 

snprintf(a,MAX_LENGTH_NAME,"%s","Foxy"); 

} 

所以其良好的知道分配的內存的大小,然後使用電話,以避免緩衝區溢出。 已編寫代碼的靜態分析可能會指出這些類型的錯誤,您也可以更改它。

+0

如果MAX_LENGTH_NAME爲4(或者源字符串的長度爲256個字符),則'strncpy()'調用仍會導致未定義的行爲,因爲'a'數組的最後一個字節仍將被初始化。 – dreamlax 2010-08-05 03:50:40

+0

如果你知道長度不會超過某個數字,任何一個都必須這樣做。否則根據需要分配,即源的長度。 Ofcourse我們還可以使用函數asprintf來處理空終止的附加字節。 – 2010-08-05 04:26:09

+0

'snprintf'確保終止空字符適合所提供的緩衝區大小,但'strncpy'不能。 – dreamlax 2010-08-05 04:29:06