我在阅读《反射的安全注意事项》,看到以下几行:
即使代码是完全可信的,透明代码也不能使用反射来访问安全性至关重要的成员。抛出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
或做错了什么?
下面的要点指出:
- 以部分信任运行的代码被视为透明的。
从命令行运行的应用程序代码以完全信任的方式运行。只要未将其标记为透明,它就可以使用反射来访问对安全至关重要的成员。当使用部分信任(例如,在沙盒应用程序域中)运行相同的代码时,程序集的信任级别决定了它是否可以访问安全性至关重要的代码:如果程序集具有强名称,并且安装在全局程序集缓存中,则它将是受信任的程序集,可以调用安全性至关重要的成员。如果它不受信任,则即使未标记为透明,它也将变为透明,并且无法访问对安全性要求较高的成员。
因此,请从标题中回答问题:
如何避免使用反射访问类的私有成员?
如果不能,则不能执行执行反射的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句