C# Net中闭包中的隐藏变量

C# Net中闭包中的隐藏变量,c#,.net,closures,code-access-security,C#,.net,Closures,Code Access Security,我有一些C代码。它具有一些存储为自动属性或专用字段的配置设置。理论上,使用它的人可以通过反射修改私有变量 有办法否认吗?我可以使用只读静态字段,然后它们就不能被修改了。但对该类本身的引用仍然可以替换为具有恶意设置的另一个类 我考虑过闭包中的匿名方法和变量。但在这种情况下,仍然可以替换指向该代理的链接 此外,我还尝试为我的字段指定SecurityCriticalAttribute,因为调用方可能没有FullTrust访问权限,但似乎没有验证字段的访问权限。仅用于方法\类本身 更新 我是这样修正的:

我有一些C代码。它具有一些存储为自动属性或专用字段的配置设置。理论上,使用它的人可以通过反射修改私有变量

有办法否认吗?我可以使用只读静态字段,然后它们就不能被修改了。但对该类本身的引用仍然可以替换为具有恶意设置的另一个类

我考虑过闭包中的匿名方法和变量。但在这种情况下,仍然可以替换指向该代理的链接

此外,我还尝试为我的字段指定SecurityCriticalAttribute,因为调用方可能没有FullTrust访问权限,但似乎没有验证字段的访问权限。仅用于方法\类本身

更新

我是这样修正的:

  • 通过构造函数初始化所有变量
  • 所有变量都有只读定义
  • 我已经将CAS属性添加到构造函数中,所以没有FullTrust的人不能修改它

    [PermissionSetAttribute(SecurityAction.Demand, Unrestricted = true)]
    
因此,要更新变量,用户需要创建该类的新实例。然后CAS验证将验证调用方


我不太喜欢这种方法,如果您有更好的方法,我会很感激的

不幸的是,字段上的
只读
修饰符不会阻止通过反射进行构造后修改。无法阻止具有私有反射权限的代码修改内存中的应用程序状态。事实上,
ReflectionPermission
被认为是一种“危险”权限,对于这种权限,授予本质上类似于完全信任授予()


换句话说,如果您打算在沙盒中授予私有反射权限,那么您可能根本不需要麻烦沙盒…

您不能:是的,同意。但我的调用者将使用沙盒appdomain。appdomain将只具有反射权限。看来构造函数上的[PermissionSet]现在对我来说很好。也许是的,没有限制的AppDomain,我不能否认。看来你是对的。我认为若字段是只读的,那个么CLR不允许更改它,因为编译器拒绝它。但似乎我错了。这里没有幸福:(