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

C/C++/Java 安全編碼實戰:注入攻擊、SQL注入、XSS 防禦與靜態分析

     編輯:關於C++

注入攻擊:最危險的代碼注入

攻擊者將惡意代碼/數據注入運行進程,劫持控制流。經典案例:Windows 動畫光標漏洞,通過畸形文件觸發瀏覽器加載,實現任意代碼執行。

緩衝區溢出原理

void LoadTypeFromStream(unsigned char* stream, SOMETYPE* typtr) {
    int len;
    memcpy(&len, stream, sizeof(int)); // 讀取長度
    memcpy(typtr, stream + sizeof(int), len); // 無邊界檢查,直接拷貝
}

若 len > sizeof(SOMETYPE),將覆蓋棧幀:局部變量、返回地址、調用鏈信息。攻擊者精心構造 len 及後續字節,覆寫返回地址指向注入的 Shellcode。

修復:一行守衛代碼

if (len < 0 || len > sizeof(SOMETYPE)) throw TaintedDataException();

核心原則:永不信任輸入流,嚴格校驗長度與格式。現代編譯器提供 /GS (Stack Guard)、ASLR、DEP 等緩解措施,但代碼層面檢查不可或缺。

SQL 注入:拼接查詢的噩夢

反模式:字符串拼接構建 SQL。
攻擊輸入:PWD: x' OR '1'='1 → SELECT ... WHERE PWD='x' OR '1'='1' 恆真,繞過認證。
修復:參數化查詢。
PreparedStatement stmt = conn.prepareStatement("SELECT id FROM users WHERE user=? AND pwd=?");
stmt.setString(1, user); stmt.setString(2, pwd);

數據庫引擎解析參數,徹底隔離代碼與數據。同時移除異常中回顯用戶輸入,防止二次 XSS。

跨站腳本攻擊(XSS)

核心:未過濾的用戶輸入直接回顯頁面。
反射型:搜索關鍵詞直接寫入響應。
持久型:惡意腳本存入數據庫,後續訪問者執行。
防禦:輸出編碼。
Java: StringEscapeUtils.escapeHtml4(input) (JTidy)。
ASP: Server.HTMLEncode(Request.Form("username"))。
原則:存儲前編碼或輸出前編碼,寧可重複編碼不可漏編碼。

漏洞發現:靜態源代碼分析 (SCA)

人工審查低效且易漏。SCA 工具掃描代碼模式(如危險函數調用、未檢查邊界、拼接 SQL),精準定位缺陷。
商業工具:Klocwork (C/C++/Java,IDE 集成)。
開源選項:Cppcheck, SonarQube, FindSecBugs。
將 SCA 集成 CI/CD 流水線,實現「提交即掃描」,左移安全。

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