我是C新手,想知道指針是否可能被像strcpy()這樣的脆弱c函數溢出。我在源代碼中看到了很多,它是避免緩衝區溢出的一種方法嗎?字符指針溢出
字符指針溢出
回答
是的。這實際上是緩衝區溢出漏洞的經典原因。避免溢出緩衝區的唯一方法是確保您不會做任何可能導致溢出的操作。在strcpy
的情況下,解決方案是使用strncpy
,其中包括要將字符串複製到的緩衝區的大小。
當然,如果你不爲緩衝區分配足夠的空間,那麼你當然可以:
char* ptr = (char*)malloc(3);
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */
然而,什麼是真正糟糕的是,這種代碼可以不給你任何錯誤的工作,但它可能在某處覆蓋一些內存可能會導致您的程序在稍後發生,看似隨機發生,您可能不知道爲什麼。這些是時間的來源(有時甚至是天)的沮喪,誰花了任何大量的時間寫作C
會告訴你。
這就是爲什麼與C
,你必須非常小心這種事情,和雙,三,第n度檢查你的代碼。之後,再次檢查。
一些其他的方法是
#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");
}
所以其良好的知道分配的內存的大小,然後使用電話,以避免緩衝區溢出。 已編寫代碼的靜態分析可能會指出這些類型的錯誤,您也可以更改它。
如果MAX_LENGTH_NAME爲4(或者源字符串的長度爲256個字符),則'strncpy()'調用仍會導致未定義的行爲,因爲'a'數組的最後一個字節仍將被初始化。 – dreamlax 2010-08-05 03:50:40
如果你知道長度不會超過某個數字,任何一個都必須這樣做。否則根據需要分配,即源的長度。 Ofcourse我們還可以使用函數asprintf來處理空終止的附加字節。 – 2010-08-05 04:26:09
'snprintf'確保終止空字符適合所提供的緩衝區大小,但'strncpy'不能。 – dreamlax 2010-08-05 04:29:06
- 1. 指針,字符串和溢出錯誤
- 2. 如何防止字符指針緩衝區溢出?
- 3. 防止結構中的字符指針溢出
- 4. C指針,指針,字符
- 5. 獲取指針字符指針的地址字符指針
- 6. 字符指針
- 7. 字符指針
- 8. 字符指針
- 9. 字符指針
- 10. 堆棧溢出或指針錯誤?
- 11. C中指針堆棧溢出
- 12. Ç指定字符串指針到其他字符串指針
- 13. 打印字符串流輸出指針
- 14. 字符指針拋出訪問衝突
- 15. 字符指針導致輸出錯誤
- 16. 指向字符的指針
- 17. C++指針字符
- 18. 字符串指針
- 19. 迭代字符指針的指針
- 20. 動態分配字符指針,指針
- 21. 字符指針vs數組指針
- 22. 字符指針指針數組用C
- 23. 字符指針VS INT指針
- 24. 與字符指針和整數指針
- 25. 複製字符串指針,指針
- 26. 下溢或溢出的指針會發生什麼?
- 27. 將字符指針分配給字符指針數組
- 28. C指針鑄造:單個int指針雙字符指針
- 29. 指針在C,整數指針字符指針
- 30. C - 傳遞和操作字符指針和指針指針
'strncpy'沒有什麼幫助,因爲如果在目標中沒有空間來終止空字符,那麼就不會在那裏放置(即如果源比目標大小更長)。有些人提供比實際目的地大小少的人。 – dreamlax 2010-08-04 23:10:42
'strncpy'的API使它很容易使用它,我發現它很多次都使用不正確。我不知道人們爲什麼如此害怕計算緩衝區大小,分配內存和使用原始函數...... – Thanatos 2010-08-05 03:52:55
@Thanatos:在這種情況下,當你從用戶接收緩衝區時,你會做什麼?你甚至不能安全地調用'strlen',它可能不會被NUL終止。 – torak 2010-08-05 12:18:30