C# 如何避免使用反射访问类的私有成员?
我正在阅读,我看到了下面一行: 透明代码不能使用反射来访问安全关键成员,即使代码完全受信任。抛出MethodAccessException、FieldAccessException或TypeAccessException 因此,我编写了一个测试程序:C# 如何避免使用反射访问类的私有成员?,c#,security,reflection,C#,Security,Reflection,我正在阅读,我看到了下面一行: 透明代码不能使用反射来访问安全关键成员,即使代码完全受信任。抛出MethodAccessException、FieldAccessException或TypeAccessException 因此,我编写了一个测试程序: using ClassLibrary; namespace ReflectionSecurityTest { class Program { static void Main(string[] args)
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运行的任何东西在某个时刻都会在一块内存中,其他进程可以检查它。如果您想隐藏您的实现,请查看模糊处理等。不过,这通常不值得付出努力。如果你真的有一些你绝对不想看到的独特算法,在你控制的服务器上运行它,让用户发送参数。