C++ 的安全性最佳作法
本文包含安全性工具和作法的相關資訊。 使用它們不會讓應用程式免受攻擊,但是可能可以減少成功的攻擊。
Visual C++ 安全性功能
這些安全性功能內建于 Microsoft C++ 編譯器和連結器中:
/guard
(啟用控制流程防護)
讓編譯器在編譯時期分析間接呼叫目標的控制流程,然後插入程式碼以在執行時間驗證目標。
/GS
(緩衝區安全性檢查)
指示編譯器將滿溢偵測程式碼插入可能有遭利用風險的函式。 偵測到滿溢時,就會停止執行。 預設會開啟這個選項。
/SAFESEH
(影像有保管庫例外狀況處理常式)
指示連結器將包含每個例外狀況處理常式位址的資料表併入輸出映像中。 在執行階段,作業系統會使用此資料表,確定只會執行合法的例外狀況處理常式。 這有助於防止惡意攻擊在執行階段所引入的執行例外狀況處理常式。 根據預設,這個選項為關閉狀態。
/NXCOMPAT
、 /NXCOMPAT
(與資料執行防止相容) 這些編譯器和連結器選項可啟用資料執行防護 (DEP) 相容性。 DEP 會保護 CPU 使其不執行非程式碼頁面。
/analyze
(程式碼分析)
此編譯器選項會啟動報告潛在安全性問題 (例如緩衝區滿溢、未初始化的記憶體、Null 指標取值以及記憶體流失) 的程式碼分析。 根據預設,這個選項為關閉狀態。 如需詳細資訊,請參閱 C/C++ 的程式碼分析概觀 。
/DYNAMICBASE
(使用位址空間配置隨機化)
此連結器選項會建置可執行檔映像,以在開始執行時於記憶體不同位置載入。 此選項也會讓記憶體中的堆疊位置更難預測。
安全性增強 CRT
C 執行階段程式庫 (CRT) 已增強,以包括造成安全性風險之函式的安全版本 (例如,未檢查的 strcpy
字串複製函式)。 因為已取代這些函式的較舊不安全版本,所以它們會造成編譯階段警告。 鼓勵您使用這些 CRT 函式的安全版本,而非隱藏編譯警告。 如需詳細資訊,請參閱 CRT 的安全性功能。
SafeInt 程式庫
保管庫Int 程式庫 有助於防止應用程式執行數學運算時可能發生的整數溢位和其他可利用的錯誤。 連結 SafeInt
庫包含 保管庫Int 類別 、 保管庫IntException 類別 ,以及數個 保管庫Int 函式 。
SafeInt
類別可防止整數溢位和除以零惡意探索。 您可以使用它來處理不同類型之值間的比較。 它提供兩個錯誤處理原則。 預設原則可供 SafeInt
類別擲回 SafeIntException
類別例外狀況,以報告無法完成數學運算的原因。 第二個原則可供 SafeInt
類別停止程式執行。 您也可以定義自訂原則。
每個 SafeInt
函式都會防止一個數學運算發生可利用的錯誤。 您可以使用兩種不同的參數,而且不需要將它們轉換成相同類型。 若要保護多個數學運算,請使用 SafeInt
類別。
Checked Iterators
已檢查的迭代器會強制執行容器界限。 根據預設,已檢查的迭代器超出範圍時,會產生例外狀況並結束程式執行。 已檢查的反覆運算器提供其他回應層級,這些回應層級取決於指派給預處理器定義的值,例如 _SECURE_SCL_THROWS
和 _ITERATOR_DEBUG_LEVEL
。 例如,在 _ITERATOR_DEBUG_LEVEL=2
,已檢查的反覆運算器會在偵錯模式中提供完整的正確性檢查,而偵錯模式是使用判斷提示提供的。 如需詳細資訊,請參閱 Checked Iterators 和 _ITERATOR_DEBUG_LEVEL
。
Managed 程式碼的程式碼分析
「Managed 程式碼的程式碼分析」(也稱為 FxCop) 會檢查組件是否符合 .NET Framework 設計方針。 FxCop 會分析每個組件中的程式碼和中繼資料,以檢查下列區域是否有缺失:
程式庫設計
當地語系化
命名規範
效能
安全性
Windows 應用程式驗證器
應用程式驗證器 (AppVerifier) 可協助您識別潛在的應用程式相容性、穩定性和安全性問題。
AppVerifier 會監視應用程式使用作業系統的方式。 它會在應用程式執行時監看檔案系統、登錄、記憶體和 API,並建議使用所發現之問題的原始程式碼修正。
您可以使用 AppVerifier:
測試常見程式設計錯誤所造成的潛在應用程式相容性錯誤。
檢查應用程式是否有記憶體相關問題。
找出應用程式中的潛在安全性問題。
Windows 使用者帳戶
使用屬於 Administrators 群組的 Windows 使用者帳戶,讓開發人員和客戶暴露在安全性風險下。 如需詳細資訊,請參閱 以使用者群組 成員身分執行,以及 使用者帳戶控制 (UAC) 如何影響您的應用程式 。
推測性執行端通道的指引
如需有關如何縮排和減輕 C++ 軟體中推測性執行端通道硬體弱點的資訊,請參閱 推測性執行端通道的 C++ 開發人員指引。