【问题标题】:Hidden variable in closure in .Net.Net中闭包中的隐藏变量
【发布时间】:2013-12-14 16:41:40
【问题描述】:

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

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

我想到了闭包中的匿名方法和变量。但在这种情况下,仍然可以替换该委托的链接。

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

更新

我是这样修的:

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

    [PermissionSetAttribute(SecurityAction.Demand, Unrestricted = true)]
    

所以要更新变量,用户需要创建该类的新实例。然后 CAS 验证将验证调用者。

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

【问题讨论】:

  • 是的,同意。但我的调用者将使用沙盒 appdomain。并且该 appdomain 将只有反射权限。似乎构造函数上的 [PermissionSet] 现在对我来说很好。可能是的,没有受限的 AppDomain,我不能否认。

标签: c# .net closures code-access-security


【解决方案1】:

不幸的是,您字段上的 readonly 修饰符不会阻止通过反射进行的构造后修改。无法阻止具有私有反射权限的代码修改内存中的应用程序状态。事实上,ReflectionPermission 被认为是“危险”权限之一,其授权本质上类似于完全信任授权 (http://msdn.microsoft.com/en-us/library/wybyf7a0.aspx)。

换句话说,如果您要在沙箱中授予私有反射权限,您可能根本不打扰沙箱......

【讨论】:

  • 好吧,看来你是对的。我想如果字段是只读的,那么 CLR 不允许更改它,因为编译器会拒绝它。但似乎我错了。这里没有幸福:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多