- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 423字
- 2020-10-30 17:56:39
2.2.5 與函數無關的字符串錯誤
大部分在標準字符串處理庫<string.h>中定義的函數都非常容易出錯,包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微軟Visual Studio已經廢棄了許多這樣的函數。盡管如此,由于空字符結尾的字符串是用字符數組實現的,因此,完全有可能在不調用任何函數的情況下做了不安全的字符串操作。下面的程序并沒有調用任何字符串庫函數,然而卻包含了一個由字符串復制操作導致的缺陷。
01 int main(int argc, char *argv[]) { 02 int i = 0; 03 char buff[128]; 04 char *arg1 = argv[1]; 05 if (argc == 0) { 06 puts("No arguments"); 07 return EXIT_FAILURE; 08 } 10 while (arg1[i] != '\0') { 11 buff[i] = arg1[i]; 12 i++; 13 } 14 buff[i] = '\0'; 15 printf("buff = %s\n", buff); 16 exit(EXIT_SUCCESS); 17 }
這個有缺陷的程序接受一個字符串參數,并將其復制到buff字符數組,然后打印buff中的內容。變量buff被聲明為一個128個字符長的定長數組。如果提供給程序的第一個參數等于或者超過128個字符(請記住還有結尾的空字符),這個程序就會在數組的邊界外進行寫操作。
顯然,消除對危險函數的使用并不能保證你的程序就能夠避免安全缺陷。在接下來的幾節中,你將會看到這些安全缺陷是如何導致可被利用的漏洞的。
推薦閱讀
- Testing with JUnit
- MySQL 8 DBA基礎教程
- HTML5+CSS3基礎開發教程(第2版)
- Kinect for Windows SDK Programming Guide
- Building Minecraft Server Modifications
- 微服務架構深度解析:原理、實踐與進階
- 零基礎學Kotlin之Android項目開發實戰
- Hands-On Nuxt.js Web Development
- 一步一步跟我學Scratch3.0案例
- 深度學習入門:基于Python的理論與實現
- 快樂編程:青少年思維訓練
- Python Social Media Analytics
- Learning Shiny
- Getting Started with Windows Server Security
- C#程序設計基礎與實踐