如何使用ReflectionPermission拒绝反射

Mil*_*nki 19 .net c# windows security reflection

我试图在我的应用程序中添加插件,但我不希望插件完全使用反射,插件代码可以是使用Application Domain的沙箱.

我在MSDN上找到了一个AppDomain 示例,但是没有对ReflectionPermision的任何引用,并且Deny安全属性也被折旧,许多属性被折旧,我该如何停止反射呢?

Nic*_*oiu 8

要使用AppDomain.CreateDomain创建沙盒应用程序域,您应该传入一个只包含您要授予沙盒程序集的权限的PermissionSet.如果您不想授予ReflectionPermission,则不应将其添加到权限集中.

也就是说,ReflectionPermission远非唯一的"危险"权限,通常应该拒绝通用源加载项.如果您想要非常严格,您可能需要考虑仅授予SecurityPermission\Execution. 例如:

PermissionSet permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
Run Code Online (Sandbox Code Playgroud)

如果要包含其他"安全"权限,只需使用其他AddPermission调用将其添加到权限集即可.如果要包含被认为足够安全的所有权限,以便在deprcated CAS策略系统下授予Internet源代码,则可以通过将Internet区域证据传递给SecurityManager.GetStandardSandbox静态方法来提取这些权限. 例如:

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

PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence);
Run Code Online (Sandbox Code Playgroud)

注意:您在问题中提到的MSDN文章中描述了这两种方法.