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 超出界限時,會產生例外狀況並使程式結束執行。已檢查的迭代器能提供其他層級的回應,這些回應取決於指派給定義之前置處理器的值,例如 _SECURE_SCL_THROWS_ITERATOR_DEBUG_LEVEL。例如,在 _ITERATOR_DEBUG_LEVEL=2 中,已檢查的迭代器能在偵錯模式下提供完整的正確性檢查,而這些檢查可透過使用判斷提示來取用。如需詳細資訊,請參閱已檢查的迭代器

Managed 程式碼的程式碼分析

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

  • 程式庫設計

  • 當地語系化

  • 命名規範

  • 效能

  • 安全性

Windows 應用程式驗證器

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

AppVerifier 可監視應用程式使用作業系統的情況。在執行應用程式時,它會監視檔案系統、登錄、記憶體和應用程式開發介面,並能針對發現的問題提供原始程式碼的修正建議。

您可以使用 AppVerifier:

  • 測試是否有一般程式設計錯誤所引起的潛在應用程式相容性錯誤。

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

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

AppVerifier 是應用程式相容性工具組的一部分,這些工具組可從TechNet 網站上的 應用程式相容性 取得。

.NET Framework 安全性功能

Configuring Security Policy可描述調整 .NET Framework 安全性原則的方針和工具。

Windows 使用者帳戶

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

請參閱

參考

System.Security

概念

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

其他資源

.NET Framework 中的安全性