我正在阅读Security Considerations for Reflection,我看到以下一行:
即使代码完全受信任,透明代码也无法使用反射来访问安全关键成员。抛出MethodAccessException,FieldAccessException或TypeAccessException。
所以,我写了一个测试程序:
班级图书馆:
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
做了什么或者我做错了什么?
答案 0 :(得分:4)
下面的要点指出:
- 使用部分信任运行的代码视为透明。
从命令行运行的应用程序代码以完全信任的方式运行。只要它没有标记为透明,它就可以使用反射来访问安全关键成员。当使用部分信任运行相同的代码时(例如,在沙盒应用程序域中),程序集的信任级别确定它是否可以访问安全关键代码:如果程序集具有强名称并安装在全局程序集缓存中,则是一个值得信赖的程序集,可以调用安全关键成员。如果它不受信任,即使它没有标记为透明,它也会变得透明,并且它无法访问安全关键成员。
所以回答你标题中的问题:
如何使用Reflection避免访问类的私有成员?
如果您无法对执行反射的代码进行沙盒处理,则不能。