2013-12-14 43 views
0

我有一些C#代码。它有一些配置设置存储为自动属性或专用字段。理论上,使用它的人可以通过Reflection来修改私有变量。隐藏在.Net中的闭包变量

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

我想过关闭匿名方法和变量。但在这种情况下,该代表的链接仍可以替换。

另外我试过为我的字段指定SecurityCriticalAttribute,因为调用者可能没有FullTrust访问权限,但似乎没有验证字段的访问权限。只是方法\类itselfs

UPDATE

我固定它以这样的方式:

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

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

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

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

+2

您不能:http://stackoverflow.com/a/8357546/857807 – dcastro

+0

是的,同意。但我的调用者将使用沙箱appdomain。而该appdomain只会拥有反射权限。似乎构造函数的[PermissionSet]现在对我来说工作正常。也许是的,没有限制的AppDomain,我不能否认它。 –

回答

2

不幸的是,在你的领域readonly修饰不会阻止通过反射施工后修饰。没有办法阻止具有私有反射权限的代码修改内存中的应用程序状态。实际上,ReflectionPermission被认为是“危险”权限之一,对此,权限实质上类似于完全信任授权(http://msdn.microsoft.com/en-us/library/wybyf7a0.aspx)。

换句话说,你还不如不打扰沙盒在所有如果你打算在沙盘授予私人反射权限...

+0

好吧,看起来你是对的。我认为如果field是只读的,那么CLR不允许改变它,因为编译器会拒绝它。但似乎我错了。这里没有幸福:( –