C# Net中闭包中的隐藏变量
我有一些C代码。它具有一些存储为自动属性或专用字段的配置设置。理论上,使用它的人可以通过反射修改私有变量 有办法否认吗?我可以使用只读静态字段,然后它们就不能被修改了。但对该类本身的引用仍然可以替换为具有恶意设置的另一个类 我考虑过闭包中的匿名方法和变量。但在这种情况下,仍然可以替换指向该代理的链接 此外,我还尝试为我的字段指定SecurityCriticalAttribute,因为调用方可能没有FullTrust访问权限,但似乎没有验证字段的访问权限。仅用于方法\类本身 更新 我是这样修正的:C# Net中闭包中的隐藏变量,c#,.net,closures,code-access-security,C#,.net,Closures,Code Access Security,我有一些C代码。它具有一些存储为自动属性或专用字段的配置设置。理论上,使用它的人可以通过反射修改私有变量 有办法否认吗?我可以使用只读静态字段,然后它们就不能被修改了。但对该类本身的引用仍然可以替换为具有恶意设置的另一个类 我考虑过闭包中的匿名方法和变量。但在这种情况下,仍然可以替换指向该代理的链接 此外,我还尝试为我的字段指定SecurityCriticalAttribute,因为调用方可能没有FullTrust访问权限,但似乎没有验证字段的访问权限。仅用于方法\类本身 更新 我是这样修正的:
- 通过构造函数初始化所有变量
- 所有变量都有只读定义
- 我已经将CAS属性添加到构造函数中,所以没有FullTrust的人不能修改它
[PermissionSetAttribute(SecurityAction.Demand, Unrestricted = true)]
我不太喜欢这种方法,如果您有更好的方法,我会很感激的不幸的是,字段上的
只读
修饰符不会阻止通过反射进行构造后修改。无法阻止具有私有反射权限的代码修改内存中的应用程序状态。事实上,ReflectionPermission
被认为是一种“危险”权限,对于这种权限,授予本质上类似于完全信任授予()
换句话说,如果您打算在沙盒中授予私有反射权限,那么您可能根本不需要麻烦沙盒…您不能:是的,同意。但我的调用者将使用沙盒appdomain。appdomain将只具有反射权限。看来构造函数上的[PermissionSet]现在对我来说很好。也许是的,没有限制的AppDomain,我不能否认。看来你是对的。我认为若字段是只读的,那个么CLR不允许更改它,因为编译器拒绝它。但似乎我错了。这里没有幸福:(