共用方式為


反映的安全性考量

提供對非公用資訊的存取會涉及安全性風險。允許在型別上探索非公用資訊的程式碼可能可以存取程式碼、資料和其他您想要保持私用 (Private) 的資訊。因此,.NET Framework 安全性強制使用規則,判斷反映可使用於探索型別資訊和存取型別到什麼程度。取決於執行的作業,有可能需要序列化的 ReflectionPermissionSecurityPermission

所有程式碼可以不需使用權限而使用反映來執行下列工作:

  • 取得公用型別和它們的公用成員的資訊。

  • 探索程式碼在哪個模組和組件中。

  • 列舉公用型別。

  • 列舉與使用反映的程式碼位於相同組件中的非公用型別。

  • 列舉組件和模組。

  • 叫用公用成員。

  • 叫用呼叫中程式碼基底類別的家族存取成員。

  • 叫用呼叫中程式碼組件的組件存取成員。

若要探索非公用成員的相關資訊,呼叫端必須擁有代表取得型別資訊能力的 ReflectionPermission。如果沒有這個使用權限,程式碼就無法透過 TypeAssemblyModule 上的 Get 方法,使用反映來取得非公用成員 (即使屬於自己類別) 的相關資訊。

若要使用反映叫用方法或存取不可存取的 (依一般型別系統存取範圍規則來說) 欄位,程式碼必須被授予成員存取的 ReflectionPermission

Note注意事項

建議您讓安全性原則對於來自網際網路的程式碼,拒絕授予 ReflectionPermission

序列化的 SecurityPermission 提供取得和設定可序列化型別的任何非暫時性資料欄位 (也就是,不只是存在於記憶體中的成員) 的能力,不論存取範圍如何。這個使用權限允許程式碼探索並變更執行個體的私用狀態(除了被授予適當使用權限之外,型別還必須在中繼資料 (Metadata) 中被標記為可序列化)。

連結要求檢查

如果方法或委派 (Delegate) 具有某個使用權限 PLinkDemand,執行階段將會針對方法或委派的呼叫端執行連結要求檢查,以確認呼叫端獲得授與使用權限 P。這個連結要求檢查在型別資訊和引動過程的探索 (Discovery) 中都會發生。

請避免撰寫採用 MethodInfo 參數的公用 API,尤其是高度受信任的程式碼。使用權限權利可能更容易受到惡意程式碼的損害。例如,試想在高度受信任的程式碼中採用 MethodInfo 參數的公用 API。假設公用 API 以提供的參數間接呼叫 MethodInfo.Invoke。如果公用 API 不執行必要的使用權限檢查,由於安全性系統決定呼叫端受到高度信任,對於 Invoke 方法的呼叫就必定都會成功。即使惡意程式碼沒有使用權限而直接叫用方法,它仍可以呼叫公用 API 間接做到這點。

請參閱

參考

ReflectionPermissionFlag.TypeInformation
ReflectionPermissionFlag.MemberAccess
SecurityPermission

概念

檢視型別資訊
套用屬性
存取自訂屬性