大部分的應用程式程式代碼只要使用 .NET 所實作的基礎結構即可。 在某些情況下,需要特定於應用程式的額外安全措施,方法是擴充安全性系統或使用新的臨時方法所建置。
在程式代碼中使用 .NET 強制許可權和其他強制執行,您應該建立障礙,以防止惡意代碼存取您不希望其擁有或執行其他不想要動作的資訊。 此外,您必須在使用信任程式碼的所有預期案例中,在安全性與可用性之間取得平衡。
本總覽描述程式碼如何設計以配合安全系統運作的不同方式。
保護資源存取
設計及撰寫程式代碼時,您必須保護並限制程式代碼對資源的存取,特別是在使用或叫用未知來源的程式碼時。 因此,請記住下列技術,以確保您的程式代碼安全:
請勿使用代碼存取安全性 (CAS)。
請勿使用部分信任的程序代碼。
請勿使用 AllowPartiallyTrustedCaller 屬性 (APTCA)。
請勿使用 .NET 遠端處理。
請勿使用分散式元件物件模型 (DCOM)。
請勿使用二進位格式器。
程式代碼存取安全性和 Security-Transparent 程式代碼不被支援用作對部分信任的程式代碼的安全邊界。 我們建議不要載入和執行未知來源的程式代碼,而不需要採取替代的安全性措施。 替代的安全性措施如下:
虛擬化
AppContainers
作業系統 (OS) 使用者和權限
Hyper-V 容器
安全性中性程序代碼
安全性中性程序代碼不會對安全性系統明確執行任何動作。 它會以接收到的任何權限執行。 雖然無法攔截與受保護作業相關聯的安全性例外狀況的應用程式(例如使用檔案、網路等)可能會導致未處理的例外狀況,但安全性中性程序代碼仍會利用 .NET 中的安全性技術。
安全中立庫具有您應該了解的特殊特性。 假設您的程式庫提供使用檔案或呼叫非受控代碼的 API 元素。 如果您的程式代碼沒有對應的許可權,則不會如所述執行。 不過,即使程式代碼具有許可權,呼叫它的任何應用程式程式代碼都必須有相同的許可權才能運作。 如果呼叫程式碼沒有正確的許可權,SecurityException 就會出現,因為程式碼存取安全性堆疊檢查。
不是可重複使用元件的應用程式程序代碼
如果您的程式代碼是其他程式代碼不會呼叫的應用程式的一部分,安全性就很簡單,而且可能不需要特殊程序代碼。 不過,請記住,惡意代碼可以呼叫您的程序代碼。 雖然程式代碼存取安全性可能會阻止惡意代碼存取資源,但這類程式代碼仍然可以讀取可能包含敏感性資訊的字段或屬性值。
此外,如果您的程式代碼接受來自因特網或其他不可靠的來源的使用者輸入,您必須小心惡意輸入。
原生代碼實作的管理包裝器
一般而言,在此案例中,某些有用的功能會在本機代碼中實作,您希望讓其可用於 Managed 程式代碼。 使用平台調用或 COM Interop 輕鬆撰寫 Managed 包裝函式。 不過,如果您這樣做,包裝器的呼叫者必須具有 Unmanaged 程式代碼許可權才能運作成功。 在默認原則下,這表示從內部網路或因特網下載的程式代碼不適用於包裝函式。
與其將非受控代碼的權限授予所有使用這些包裝函式的應用程式,不如只將這些權限授予包裝程式碼。 如果基礎功能不會公開任何資源,而且實作同樣安全,包裝函式只需要宣告其擁有的許可權,這可讓任何程式碼透過它呼叫。 涉及資源時,安全性編碼應該與下一節所述的連結庫程序代碼案例相同。 因為包裝函式可能會將呼叫端暴露給這些資源,因此需要仔細驗證原生程式碼的安全性,這也是包裝函式的責任。
暴露受保護資源的程序代碼
下列方法是最強大的方法,因此對於安全性編碼而言可能非常危險(若未正確完成):您的連結庫可作為其他程式碼存取其他無法使用之特定資源的介面,就像 .NET 類別強制執行其使用之資源的許可權一樣。 無論您在何處公開資源,您的程式代碼必須先要求適當的資源許可權(也就是,它必須執行安全性檢查),然後通常會判斷其執行實際作業的許可權。