2011-09-05 45 views
19

我試圖在我的應用程序中添加插件,但我不想讓插件使用反射,插件代碼可以是使用應用程序域的沙箱。如何使用ReflectionPermission拒絕反射

我發現在MSDN一個AppDomain中example,但不具有ReflectionPermision任何引用,並且也貶值拒絕安全屬性,大量的屬性都大幅貶值,我該如何停止反思呢?

回答

8

要使用AppDomain.CreateDomain創建沙盒應用程序域,您應該傳遞一個PermissionSet,其中只包含要授予沙盒程序集的權限。如果您不想授予ReflectionPermission,則不應將其添加到權限集。

也就是說,ReflectionPermission遠離通常應拒絕給通用源插件的唯一「危險」權限。如果您想要非常嚴格,您可能需要考慮只授予SecurityPermission \ Execution。 例如

PermissionSet permissionSet = new PermissionSet(PermissionState.None); 
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 

如果你想包括額外的「安全」的權限,你可以簡單地將它們添加到使用額外AddPermission調用權限集。如果您希望包含所有被認爲足夠安全的權限,以便將其授予源於代理的CAS策略系統的Internet源代碼,您可以通過將Internet區域證據傳遞給SecurityManager.GetStandardSandbox靜態方法來提取這些權限。 例如

Evidence evidence = new Evidence(); 
evidence.AddHostEvidence(new Zone(SecurityZone.Internet)); 

PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence); 

注::這兩種方法在您提到的問題中提到的MSDN article中都有描述。

0

根據文檔,ReflectionPermission是您授予代碼訪問私有和受保護成員的內容。默認情況下,它不被授予,代碼只能訪問公共成員。如果您試圖隱藏公共成員,則需要創建一個不會公開它們的新界面。

+0

不要忘記,通過繼承類,惡意代碼*可以*訪問受保護的成員。不過,它無法訪問現有對象的受保護成員。 – svick

+4

使用'sealed'關鍵字來防止類被繼承。 – DevDelivery