設定方法存取的安全性
更新:2007 年 11 月
有些方法可能並不適合讓任意未受信任的程式碼來呼叫。這類方法會造成幾個風險:方法可能會提供某些限制資訊;它可能會信任傳遞給它的任何資訊;它可能不會執行參數的錯誤檢查;它可能因為參數錯誤而無法作用或是執行有害的動作。您應該留意這些情況,並採取適當的動作來協助保護方法。
在某些情況下,您可能需要限制不提供作公用 (Public) 用途,但仍然必須是公用的方法。例如,您可能有一個介面必須跨您自己的 DLL 呼叫,因此它必須是公用的,但是為了避免客戶使用它或是防止惡意程式碼利用進入元件的進入點 (Entry Point),您並不想將它公開。將方法限制成不提供公用用途 (但必須是公用的) 的另一個常見的理由是要避免記載或支援可能位於非常內部的介面。
Managed 程式碼提供幾種限制方法存取的方法:
如果可以信任類別、組件或衍生類別,則限制它們的存取範圍。這是限制方法存取最簡單的方法。請注意,一般來說,衍生類別會比它們衍生來源的類別還不可靠,雖然某些情況下它們會共用父類別的識別。特別是請勿從關鍵字 protected 推斷信任,安全性內容中不一定會使用這個關鍵字。
將方法存取限制為指定識別的呼叫端 -- 基本上是您所選擇的任何特定辨識項 (強式名稱、發行者、區域等)。
將方法存取限制為具有您選取的任何使用權限的呼叫端。
同樣地,宣告式安全性也可讓您控制類別的繼承 (Inheritance)。您可以使用 InheritanceDemand 來執行下列動作:
要求衍生類別必須具有指定的識別或使用權限。
要求覆寫特定方法的衍生類別必須具有指定的識別或使用權限。
以下範例顯示如何要求以特定強式名稱簽名呼叫端,以協助保護公用類別受到限制存取。這個範例會使用 StrongNameIdentityPermissionAttribute 加上 Demand 當做強式名稱。如需如何以強式名稱簽署組件的工作詳細資訊,請參閱建立和使用強式名稱的組件。
<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")> _
Public Class Class1
End Class
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1
{
}