【发布时间】:2013-09-27 20:03:25
【问题描述】:
我正在尝试使用应用程序域构建一个沙盒,以隔离潜在错误代码的执行。
我想限制反射。
我正在以这种方式构建沙盒:
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);
私有实例字段和私有属性可以正常工作:在沙箱中访问它们的任何尝试都会被运行时拒绝。
但我注意到它不适用于 literal fields(C# 中的 const):总是可以获得 literal 的值字段,即使是私有的:
private const string PASSWORD = "secret";
private string password = "secret";
private string Password
{
get
{
return "secret";
}
}
password 和 Password 得到了正确保护,但是任何代码都可以通过基本反射获得 PASSWORD 的值:
string password = typeof(User).GetField("PASSWORD", BindingFlags.NonPublic | BindingFlags.Static).GetValue(currentUser) as string; // OK no problem take it, it's free!
我想了解这种行为背后的基本原理:是因为字面值在程序集中总是“容易”可见,因此防止反射是一场失败的战斗,还是因为最终值并未真正“调用”所以没有安检还是……?
这个例子并不真正相关,因为密码不会被共享,但假设秘密值是用于加密的盐值或类似的东西......
感谢您的帮助。
【问题讨论】:
标签: c# .net reflection appdomain reflectionpermission