首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

strcat() 函數常見陷阱:緩衝區溢出與安全替代方案

     編輯:關於C語言

strcat() 函數常見陷阱:緩衝區溢出與安全替代方案

strcat(char *_Destination, const char *_Source) 用於將源字符串追加到目標字符串末尾,返回目標字符串指針。但它是 C 語言中最常見的安全隱患來源之一。

核心問題:緩衝區溢出

若連接後的字符串長度超過目標數組定義的大小,將導致內存越界覆蓋相鄰數據,引發不可預測的崩潰或安全漏洞。

典型錯誤案例

void charWrite() {
    FILE *file;
    char type[4] = "wt+";
    char path[30] = "C:/Users/Fahy/Desktop/"; // 已佔用 22 字節
    char filename[20];
    scanf("%s", filename); // 若輸入超過 8 字符,strcat 將導致 path 越界
    strcat(path, filename);
    // ... 後續文件操作
}

path 總長 30,初始佔 22,剩餘 8 字節(含結束符 \0)。若用戶輸入超過 7 個字符的文件名,strcat 寫入時將越界。

解決方案

  1. 擴大目標緩衝區:定義足夠大的數組(如 char path[256]),但無法從根本杜絕風險。
  2. 使用 strncat 限制長度:strncat(dest, src, sizeof(dest) - strlen(dest) - 1) 確保不超出邊界。
  3. 現代安全替代品:C11 標準提供 strcat_s,Windows 有 StringCchCat,Linux 可用 asprintf 動態分配。
  4. 動態內存管理:根據實際需要 malloc/realloc 分配足夠空間,用完 free 釋放。

最佳實踐建議

  • 永遠不信任外部輸入長度,輸入前必須驗證或限制。
  • 代碼審查時重點檢查所有 strcat/strcpy/sprintf 等非安全函數調用。
  • 啟用編譯器緩衝區保護(如 GCC 的 -fstack-protector-strong、MSVC 的 /GS)。
  • 採用安全字符串庫(如 safeclib)替換標準庫危險函數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved