我正在尝试在我的应用程序中添加插件,但我不希望插件完全使用反射,插件代码可以是使用Application Domain的沙箱。
我在MSDN上找到了一个AppDomain example,但是没有对ReflectionPermision的任何引用,并且Deny安全属性也被折旧,许多属性都被折旧了,我该如何停止反射呢?
答案 0 :(得分:8)
要使用AppDomain.CreateDomain创建沙盒应用程序域,您应该传入一个只包含您要授予沙盒程序集的权限的PermissionSet。如果您不想授予ReflectionPermission,则不应将其添加到权限集中。
也就是说,ReflectionPermission远非唯一的“危险”权限,通常应该拒绝一般来源加载项。如果您想要非常严格,您可能需要考虑仅授予SecurityPermission \ Execution。 e.g :
PermissionSet permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
如果要包含其他“安全”权限,只需使用其他AddPermission调用将其添加到权限集即可。如果要包含被认为足够安全的所有权限,以便在deprcated CAS策略系统下授予Internet源代码,则可以通过将Internet区域证据传递给SecurityManager.GetStandardSandbox静态方法来提取这些权限。 e.g :
Evidence evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence);
N.B。:您提到问题的MSDN article中描述了这两种方法。
答案 1 :(得分:0)
根据文档,您授予ReflectionPermission以授予私人和受保护成员代码访问权限。默认情况下,它不会被授予,代码只能访问公共成员。如果您试图隐藏公共成员,则需要创建一个不公开它们的新界面。