我正在尝试使用应用程序域构建沙箱来隔离潜在错误代码的执行。
除其他外,我想限制反射。
我正在以这种方式构建沙箱:
AppDomainSetup sandboxSetup = new AppDomainSetup
{
ApplicationBase = "."
};
PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
AppDomain sandbox = AppDomain.CreateDomain("sandbox", null, sandboxSetup, permissions);
它适用于私有实例字段和私有属性:在沙箱中访问它们的任何尝试都会被运行时拒绝。
但我注意到它不适用于文字字段( C# 中的const):始终可以获得文字字段的值,即使是私有的:
private const string PASSWORD = "secret";
private string password = "secret";
private string Password
{
get
{
return "secret";
}
}
密码和密码受到正确保护,但任何代码都可以通过基本反射获得PASSWORD的值:
string password = typeof(User).GetField("PASSWORD", BindingFlags.NonPublic | BindingFlags.Static).GetValue(currentUser) as string; // OK no problem take it, it's free!
我想了解这种行为背后的基本原理:是因为文字值在程序集中总是“容易”可见,所以防止反射是一场失败的战斗,还是因为最终值没有真正“调用”所以有没有安检还是...?
这个例子并不真正相关,因为密码不会被共享,但想象秘密值是用于加密的盐值或类似的东西......
谢谢你的帮助。