共用方式為


Demand 和 LinkDemand 的比較

更新:2007 年 11 月

宣告式安全性提供兩種安全性檢查,它們雖然很類似,但執行的檢查項目卻非常不同。您應該暸解這兩種形式的檢查,因為選擇錯誤會造成安全性降低或效能減損的結果。如需詳細資訊,請參閱安全性要求

宣告式安全性提供下列安全性檢查:

  • Demand 是指定程式碼存取安全性堆疊查核行程。堆疊上的所有呼叫端必須擁有指定的使用權限或識別 (Identity) 才能通過。Demand 會發生在每一個呼叫上,因為堆疊可能包含不同的呼叫端。如果您重複呼叫方法,每一次的呼叫都會執行這個安全性檢查。Demand 是一種很好的保護方法,可避免遭受偽裝攻擊;未經授權的程式碼在試圖通過它時都會被攔截。

  • LinkDemand 於 Just-in-Time (JIT) 編譯時期發生,而且只會檢查立即呼叫端。這種安全性檢查不會檢查呼叫端的呼叫端。一旦通過這個檢查之後,不論呼叫端呼叫多少次,都不會再有其他進一步的安全性檢查。但是,它也沒有任何保護措施可以防止遭受偽裝攻擊。使用 LinkDemand 時,通過測試而且可以參考您的程式碼的任何程式碼,都可能會讓惡意程式碼利用經過授權的程式碼進行呼叫,進而對安全性造成潛在的危險。因此,除非可以完全避免所有可能的漏洞,否則請勿使用 LinkDemand

使用 LinkDemand 時所需的額外防範措施必須個別設計程式;安全性系統可以在執行上提供必要的協助。任何錯誤都會造成安全性漏洞。使用您的程式碼的所有授權程式碼都必須負責執行下列步驟以實作額外的安全性:

  • 將呼叫程式碼限制成只能存取類別或組件。

  • 將相同的安全性檢查放到出現在要呼叫的程式碼上的呼叫程式碼,並要求其呼叫端進行同樣的動作。例如,如果您撰寫呼叫方法的程式碼,此方法由SecurityPermissionLinkDemand 保護,並指定 UnmanagedCode 旗標,則此方法也應該為這個使用權限執行 LinkDemand (或功能更強的 Demand)。不過有個例外,是在您的程式碼中已有其他安全性防護機制 (例如需求) 的情況下,您的程式碼以您認為安全的有限方式使用受 LinkDemand 保護的方法。在這種例外狀況中,呼叫端需承擔基礎程式碼上安全防護減弱的責任。

  • 確保程式碼的呼叫端不能欺騙您的程式碼,讓它代表它們來呼叫受保護程式碼。也就是說,呼叫端不能強迫授權程式碼將特定參數傳遞給受保護程式碼,或是從受保護程式碼取回產生的結果。

介面和連結要求

如果具有 LinkDemand 的虛擬方法、屬性或事件覆寫了基底類別方法,該基底類別方法也必須要有相同的 LinkDemand,被覆寫的方法才會有效。惡意程式碼有可能會轉換回基礎型別並呼叫基底類別方法。同時也請注意,連結要求可以隱含加入至沒有 AllowPartiallyTrustedCallersAttribute 組件層級屬性的組件。

在介面也有連結要求時,使用連結要求來保護方法實作是一種很好的做法。請留意以下配合介面使用連結要求的注意事項:

  • AllowPartiallyTrustedCallersAttribute 屬性也適用於介面。

  • 您可以將連結要求放在介面上,選擇性地保護特定介面不被部分受信任的程式碼使用 (例如在使用 AllowPartiallyTrustedCallers 屬性時)。

  • 如果您有一個在不含 AllowPartiallyTrustedCallersAttribute 屬性的組件中定義的介面,您就可以在部分受信任類別上實作該介面。

  • 當您將 LinkDemand 放在實作介面方法之類別的公用方法上後,如果您接著轉換到介面並呼叫方法,LinkDemand 將不會執行。在這種情況下,由於您已經連結到介面,因此只會執行介面上的 LinkDemand

請檢閱下列各項,暸解相關的安全性問題:

  • 介面方法上的明確連結要求。請確定這些連結要求可以提供預期的保護。確定惡意程式碼是否能夠如前述使用轉換的方式逃避連結要求。

  • 已套用連結要求的虛擬方法。

  • 它們實作的型別和介面。這些都應該一致地使用連結要求。

請參閱

其他資源

安全程式碼撰寫方針