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

C/C++ 安全編碼:字符串處理常見漏洞與編碼轉換實戰

     編輯:C++ 入門

字符串基礎與風險

  • C 風格字符串以 \0 結尾,長度 = strlen,sizeof 包含結尾符;
  • 字符串字面值存儲於只讀區,嘗試修改導致未定義行為;
  • char 有符號性由編譯器決定,跨平台建議顯式使用 signed/unsigned char 或 std::string。

常見漏洞類型

1. 無界複製

// 危險
char buf[8]; gets(buf);          // 已棄用,C11 移除
strcpy(buf, argv[0]);            // 無長度檢查

// 安全
char *buf = malloc(strlen(src)+1);
if (buf) strcpy(buf, src);
// 或 C++ 推薦
std::string s = src;

2. 差一錯誤

  • strncpy 不保證以 \0 結尾,需手動補齊;
  • snprintf 返回值可能超過緩衝區大小,需檢查。

3. 緩衝區溢出利用

棧溢出可覆蓋返回地址,注入 Shellcode。防禦:

  • 編譯器保護:-fstack-protector-strong -D_FORTIFY_SOURCE=2;
  • 地址空間佈局隨機化(ASLR);
  • 優先使用 std::string / std::vector 自動管理內存。

C++ std::string 陷阱

// 迭代器失效示例
std::string email;
auto it = email.begin();
for (char c : input) {
    if (c == ';') it = email.insert(it, ' '); // 必須用返回值更新
    else it = email.insert(it, c);
    ++it;
}

編碼轉換:GB2312 ↔ UTF-8 (Windows API)

// GB2312 → UTF-8
int wlen = MultiByteToWideChar(CP_ACP, 0, gbkStr, -1, nullptr, 0);
wchar_t* wstr = new wchar_t[wlen];
MultiByteToWideChar(CP_ACP, 0, gbkStr, -1, wstr, wlen);

int ulen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen, nullptr, 0, nullptr, nullptr);
char* utf8 = new char[ulen];
WideCharToMultiByte(CP_UTF8, 0, wstr, wlen, utf8, ulen, nullptr, nullptr);
utf8[ulen-1] = '\0';

// 使用完畢 delete[] wstr; delete[] utf8;

Linux 下可用 iconv 庫實現相同功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved