我正在尝试在应用程序中添加插件,但是我根本不希望插件使用反射,插件代码可以是使用Application Domain的沙箱。
我在MSDN上找到了AppDomain example,但是没有对ReflectionPermision的任何引用,并且Deny安全属性已弃用,许多属性已弃用,那么如何停止反射呢?
最佳答案
若要使用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);
N.B .:这两种方法都在问题中提到的MSDN article中进行了描述。