反映不受限制,即使它不在授权集中

Mat*_*zer 5 .net c# security sandbox .net-4.0

我目前正在尝试创建一个非常简单的沙箱.

某些类A有一个方法Execute,它在调用AppDomain者之外调用.

问题是我只有执行权限,无论如何都可以反思.

这是代码示例:

[Serializable]
public class A : MarshalByRefObject
{
    public void Execute()
    {
        typeof(A).GetConstructor(Type.EmptyTypes).Invoke(null); // Fine - Why?
        typeof(B).GetConstructor(Type.EmptyTypes).Invoke(null); // Fine - Why?
    }
}

public class B
{

}

class Program
{
    static void Main(string[] args)
    {
        PermissionSet set = new PermissionSet(PermissionState.None);

        SecurityPermission security = new SecurityPermission(SecurityPermissionFlag.Execution);
        set.AddPermission(security);

        Evidence evidence = new Evidence();
        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationBase = "C:";

        AppDomain domain = AppDomain.CreateDomain
        (
            "hello",
            evidence,
            setup,
            set
        );

        A a = (A)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(A).FullName);
        a.Execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

大!最后我做到了.

感谢您的建议,我修改了我的代码,我想与您分享,因为我很难理解如何不使用CAS但在新的.NET 4.x中使用相同类型的权限以上安全模型,以及使用沙盒的方式AppDomain.而已:

using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;

namespace ConsoleApplication1
{
    [Serializable]
    public class A : MarshalByRefObject
    {
        public void Execute()
        {
        B b = new B();

        // BOMB! ERROR! Security demand: reflection forbidden!
        b.GetType()
                .GetMethod("ExecuteInB", BindingFlags.Instance | BindingFlags.NonPublic)
                    .Invoke(b, null);
        }
    }

    public class B
    {
        private void ExecuteInB()
        {

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PermissionSet set = new PermissionSet(PermissionState.None);

            SecurityPermission security = new SecurityPermission(PermissionState.None);
            security.Flags = SecurityPermissionFlag.Execution;
            set.AddPermission(security);

            Evidence evidence = new Evidence();
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = "C:";

            AppDomain domain = AppDomain.CreateDomain
            (
                "hola",
                evidence,
                setup,
                set
            );

            A a = (A)domain.CreateInstanceAndUnwrap("ConsoleApplication1", "ConsoleApplication1.A");
            a.Execute();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 11

调用无法访问的成员时需要反射权限.A并且B是具有公共构造函数的公共类型,因此可以访问.您可以在没有反射的情况下调用那些构造函数,因此当您尝试使用反射时没有要求.

而且,使用反射进行发现总是合法的; 即使没有获得反射许可,您也可以查询对象并询问其私有成员列表.只有当您尝试调用私有成员时才需要该权限.