Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免使用反射访问类的私有成员?_C#_Security_Reflection - Fatal编程技术网

C# 如何避免使用反射访问类的私有成员?

C# 如何避免使用反射访问类的私有成员?,c#,security,reflection,C#,Security,Reflection,我正在阅读,我看到了下面一行: 透明代码不能使用反射来访问安全关键成员,即使代码完全受信任。抛出MethodAccessException、FieldAccessException或TypeAccessException 因此,我编写了一个测试程序: using ClassLibrary; namespace ReflectionSecurityTest { class Program { static void Main(string[] args)

我正在阅读,我看到了下面一行:

透明代码不能使用反射来访问安全关键成员,即使代码完全受信任。抛出MethodAccessException、FieldAccessException或TypeAccessException

因此,我编写了一个测试程序:

using ClassLibrary;
namespace ReflectionSecurityTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo f = new Foo();
            var flags = BindingFlags.Instance | BindingFlags.NonPublic;
            var field = f.GetType().GetField("X", flags);
            field.SetValue(f,15);
            Console.WriteLine(field.GetValue(f));
        }
    }
}
类库:

namespace ClassLibrary
{
    public class Foo
    {
        [SecurityCritical] private int X;
    }
}
测试程序:

using ClassLibrary;
namespace ReflectionSecurityTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo f = new Foo();
            var flags = BindingFlags.Instance | BindingFlags.NonPublic;
            var field = f.GetType().GetField("X", flags);
            field.SetValue(f,15);
            Console.WriteLine(field.GetValue(f));
        }
    }
}

我希望看到异常,但我在控制台中看到了
15
。问题是为什么?我是否误解了SecurityCritical做了什么或我做错了什么?

下面的要点指出:

  • 使用部分信任运行的代码被视为透明的
从命令行运行的应用程序代码以完全信任的方式运行。只要未标记为透明,它就可以使用反射来访问安全关键成员。当使用部分信任运行同一代码时(例如,在沙盒应用程序域中),程序集的信任级别将确定它是否可以访问安全关键代码:如果程序集具有强名称并且安装在全局程序集缓存中,则它是受信任的程序集,并且可以调用安全关键成员。如果它不受信任,即使它没有被标记为透明,它也会变得透明,并且它无法访问安全关键成员

因此,要回答标题中的问题:

如何避免使用反射访问类的私有成员


如果不能对执行反射的代码进行沙箱处理,则不能进行沙箱处理。

你是对的。但我希望我们能做到这一点,反射在大多数情况下都很酷,而且非常有用,但它也打破了语言的所有规则。你必须接受,PC运行的任何东西在某个时刻都会在一块内存中,其他进程可以检查它。如果您想隐藏您的实现,请查看模糊处理等。不过,这通常不值得付出努力。如果你真的有一些你绝对不想看到的独特算法,在你控制的服务器上运行它,让用户发送参数。