C++ 的安全性最佳作法

本文包含安全性工具和實務的資訊。 使用它們的攻擊不讓應用程式免疫,不過,它不會展開成功的攻擊。

Visual C++ 安全性功能

這些安全性功能建置在 Visual C++ 編譯器和連結器:

  • /GS (緩衝區安全性檢查)
    指示編譯器插入滿溢偵測程式碼輸入是可能會被弱點的函式。 當偵測到滿溢時,就會停止執行。 根據預設,這個選項開啟。

  • /SAFESEH (影像擁有安全例外狀況處理常式)
    在輸出影像指示連結器包含每個例外處理常式的位址資料表。 在執行階段,作業系統會使用這個資料表,以確保只有合法的例外處理常式會執行。 這有助於防止會在執行階段的惡意攻擊引入例外狀況處理常式的執行。 根據預設,這個選項會關閉。

  • /NXCOMPAT, /NXCOMPAT (與資料執行防止相容)
    這些編譯器和連結器選項啟用資料執行防止 (DEP) 相容性。 DEP 防範 CPU 避免非程式碼網頁的執行。

  • /analyze (程式碼分析)
    此編譯器選項會啟動可報告潛在安全問題的程式碼分析,例如緩衝區滿溢、未初始化記憶體、null 指標取值 (Dereferencing),以及記憶體遺漏 (Memory Leak)。 根據預設,這個選項會關閉。 如需詳細資訊,請參閱C/C++ 程式碼分析概觀

  • /DYNAMICBASE (使用位址空間隨機載入)
    此連結器選項會啟用可以在不同的位置載入至記憶體中逐步執行可執行檔映像的建置。 此選項也會使記憶體中的堆疊位置比較難以預測。

安全性增強 CRT

C 執行階段程式庫 (CRT) 擴大包括擺在安全性風險的函式範例,未檢查的 strcpy 字串複製函式的安全版本。 由於這些函式更早,不安全的版本已被取代,會產生編譯時期警告。 我們建議您使用這些 CRT 函式的安全版本而非隱藏編譯警告。 如需詳細資訊,請參閱安全性功能,則在 CRT 中

SafeInt 程式庫

SafeInt 文件庫 有助於避免可能發生的整數溢位和其他可利用的錯誤,當應用程式執行算術運算時。 SafeInt 程式庫包含 SafeInt 類別SafeIntException 類別 及數個 SafeInt 函式

SafeInt 類別能避免整數溢位和除以零錯誤。 您可以使用它處理不同型別的值之間的比較。 我提供兩項錯誤處理原則。 預設原則是讓 SafeInt 類別將 SafeIntException 類別例外狀況擲回,以報告為何數學運算無法完成。 第二個原則是讓 SafeInt 類別停止程式執行。 您也可以定義自訂的原則。

每個 SafeInt 函式均能保護一個數學運算免於發生可能遭利用的錯誤。 您可以使用兩種不同參數,而不用將它們轉換成相同型別。 若要保護多個數學運算,請使用 SafeInt 類別。

已檢查的 Iterator

已檢查的 Iterator 能強制容器界限。 根據預設,當已檢查的 Iterator 超出界限時,會產生例外狀況並使程式結束執行。 已檢查的 Iterator 能提供取決於值指派給前置處理器定義 (例如 _SECURE_SCL_THROWS_ITERATOR_DEBUG_LEVEL的其他層級回應。 例如,在 _ITERATOR_DEBUG_LEVEL=2中,已檢查的 Iterator 完整正確性簽入偵錯模式,透過使用判斷提示。 如需詳細資訊,請參閱檢查過的 Iterator

Managed 程式碼的程式碼分析

Managed 程式碼,也稱為 FxCop 的程式碼分析,檢查組件是否為 .NET Framework 設計方針。 FxCop 分析程式碼和中繼資料在每個組件檢查缺失在下列區域:

  • 程式庫設計

  • 當地語系化

  • 命名規範

  • 效能

  • 安全性

Windows 應用程式驗證器

應用程式驗證器 (AppVerifier) 這項工具可協助您識別潛在的應用程式相容性、穩定性和安全性問題。

AppVerifier 可監視應用程式使用作業系統的情況。 它來檢視檔案系統、登錄、記憶體和 API,在應用程式執行時,建議它所發現的問題的原始程式碼修正。

您可以使用 AppVerifier:

  • 用於測試是由一般程式設計錯誤造成潛在的應用程式相容性錯誤。

  • 檢查應用程式是否有記憶體相關的問題。

  • 識別應用程式中的潛在安全性問題。

AppVerifier 是應用程式相容性工具組的一部分,從 應用程式相容性 開啟 TechNet 網站下載。

.NET Framework 安全性功能

Configuring Security Policy 說明方針和工具調整 .NET Framework 安全性原則。

Windows 使用者帳戶

如果使用屬於 Administrators 群組的 Windows 使用者帳戶,會為開發人員甚至是客戶帶來安全性風險。 如需詳細資訊,請參閱以使用者群組的成員身分執行使用者帳戶控制 (UAC) 如何影響應用程式

請參閱

參考

System.Security

概念

使用者帳戶控制 (UAC) 如何影響應用程式

其他資源

.NET Framework 中的安全性