共用方式為


撰寫安全程式碼的方針

下列方針會提供數個撰寫安全程式碼的技巧。

必要項

  • 使用程式碼分析工具。

    Visual Studio Premium 內含程式碼分析工具,可以大幅增加在程式碼中找到安全性 Bug 的機率。 這些工具會更有效地尋找 Bug,而且較不費時費力。 如需詳細資訊,請參閱下列其中一個主題。

  • 進行安全性檢閱。

    每一次安全性檢閱的目標是加強已發行之產品的安全性 (透過提供更新),或確保新產品在具有最大安全性之後才會發行。

    不要隨機檢閱程式碼。 請針對安全性檢閱事先著手準備,並從小心地建立威脅模型開始。 如果您不這樣做,就會浪費大量的小組時間。 針對需要大量安全性檢閱的程式碼設定優先順序,並且決定要優先處理的安全性 Bug。

    在安全性檢閱中,請限定要尋找的問題。 當您尋找特定的問題時,通常就可以找到問題。 如果小組在某個區域中找到大量的安全性 Bug,請更加仔細地尋找 Bug。 因為這就表示可能有必須修正的架構問題。 如果找不到安全性 Bug,則通常表示安全性檢閱未正確地執行。

    在接近開發過程的每個里程碑,以及由管理階層所決定之較大的產品上市進程點時,請舉行安全性檢閱。

  • 針對安全性使用程式碼檢閱檢查清單。

    無論您在軟體開發小組中的角色為何,準備一份可供遵循的檢查清單,有助於確保設計和程式碼能符合最低要求。

  • 驗證所有的使用者輸入。

    如果允許應用程式接受使用者輸入 (直接或間接),則必須在使用輸入之前先加以驗證。 惡意的使用者會嘗試調整輸入以顯示無效的資料,讓應用程式失敗。 使用者輸入的首要規則是:所有的輸入都是錯誤的,直到驗證為正確為止。

    在使用規則運算式 (Regular Expression) 驗證使用者輸入時,請務必小心。 對於複雜的運算式,例如電子郵件地址,您很容易認為進行了完整的驗證,但是事實上並非如此。 因此,請讓同事檢閱所有的規則運算式。

  • 嚴格地驗證匯出和公用應用程式發展介面 (Application Programming Interface,API) 的所有參數。

    請確定匯出和公用 API 的所有參數是有效的。 這包括看起來一致的輸入但是超過可接受範圍的值,例如大型緩衝區大小。 不要使用判斷提示 (Assert) 來檢查匯出之 API 的參數,因為在發行的組建 (Release Build) 中,這些判斷提示會遭到移除。

  • 使用 Windows 密碼編譯 API。

    您不需自行撰寫密碼編譯軟體,反之,請使用現成的 Microsoft 密碼編譯 API。 藉由使用來自 Microsoft 的密碼編譯 API,程式開發人員可以心無旁鶩地專注於建置應用程式。 請記住,加密 (Encryption) 只能妥善解決一小部分的問題,而且常常會被用於設計原意以外的用途。 如需詳細資訊,請參閱 MSDN Library 中的加密參考 (英文)。

請避免

  • 緩衝區滿溢 (Buffer Overrun)。

    在堆疊上宣告的緩衝區因為複製大於緩衝區的資料而遭到覆寫時,就會發生靜態緩衝區滿溢。 在堆疊上宣告的變數會位於緊鄰在函式之呼叫端返回位址的位置。 緩衝區滿溢也會發生在堆積 (Heap) 中,這也一樣危險。 最常見的原因,是傳遞至例如 strcpy 這類函式但未受檢查的使用者輸入,而結果則會導致攻擊者所選定的位址覆寫函式的返回位址。 因此若要有效避免緩衝區滿溢,就必須撰寫穩固的應用程式。

  • 檢查外部輸入的判斷提示。

    判斷提示不會編譯到零售版本中, 因此不要使用判斷提示驗證外部輸入。 所有匯出之函式和方法的參數、所有的使用者輸入以及所有的檔案和通訊端 (Socket) 資料,都必須要小心地驗證其有效性,如果有錯誤則要拒絕。

  • 硬式編碼的使用者 ID 和密碼組。

    不要使用硬式編碼的密碼, 請修改安裝程式,使得建立內建使用者帳號時,能夠提示系統管理員為每一個帳號建立強式密碼。 如此,就可以保持客戶實際執行系統的安全性。

  • 使用加密解決所有的安全性問題。

    加密只能妥善解決一小部分的問題,而且常常會被用於其設計原意以外的用途。

  • 標準檔案路徑和 URL。

    請避免造成檔案位置或 URL 是很重要的情況。 請使用檔案系統 ACL,而不是根據標準檔案名稱的規則。

建議使用

  • 檢閱應用程式中所有舊的安全性缺失。

    以往所犯的安全性缺失,都可以讓您更了解這部分的知識。 通常程式碼會以重複的模式撰寫, 因此某個人在程式碼某處所犯的 Bug,表示可能會有其他人在其他地方也會犯相同的 Bug。

  • 檢閱所有的錯誤路徑。

    通常錯誤路徑中的程式碼不會被詳細地測試,而且不會清除所有的物件,例如鎖定或已配置的記憶體。 請小心地檢閱這些路徑,並視需要建立錯誤插入測試以執行此程式碼。 如需詳細資訊,請參閱 MSDN Library 中<安全 Web 應用程式的設計方針>的<輸入驗證>一節 (英文) 以及<安全性的架構和設計檢閱>的<輸入驗證>一節 (英文)。

不建議事項

  • 應用程式需要系統管理員權限才能執行。

    應用程式應該以完成工作所需之最低權限執行。 如果惡意使用者找到安全性弱點,並將程式碼插入到處理序 (Process) 中,則惡意程式碼會和主機處理序以相同的權限執行。 如果處理序以系統管理員身分執行,則惡意程式碼也會以系統管理員身分執行。 如需詳細資訊,請參閱 MSDN Library 中的使用非系統管理權限在 Visual Studio .NET 中開發軟體 (英文)。

詳細資訊

威脅模型 (英文)