2009-05-21 19 views
11

我看到你可以操纵private and internal members using reflection。我也看到它说,一个'sealed' class is more secure that one that isn't访问级别和修饰符(私有,密封等)是否在C#中用于安全目的?

修饰语是否“公开,保护,内部,私人,抽象,封闭,只读”不只是绅士关于设计和API使用的协议,只要您有权访问反射,这些修改就可以被破坏?如果黑客已经在运行调用API的代码,那么游戏已经失败了,对吧?

以下是否比其他课程更安全?

//private class 
sealed class User 
{ 
    private string _secret = "shazam"; 
    public readonly decimal YourSalary; 
    public string YourOffice{get;}; 
    private DoPrivilegedAction() 
    { 
    } 
} 
+0

“黑客”可以在没有.Net和Java的元数据的情况下修改您的代码。任何人都记得DeHacked http://en.wikipedia.org/wiki/Dehacked 所有你可以做到的,希望尽可能让它变得困难。 – 2009-05-21 01:32:55

回答

27

首先,回答您的问题:安全系统旨在保护好用户免受不良代码;它明确没有被设计用于保护GOOD CODE不良用户。您的访问限制通过减少对您的用户的攻击部分信任的敌对代码。他们不会减轻攻击你的代码敌对用户。如果威胁是恶意用户获取你的代码,那么你有一个很大的问题。安全系统根本不能减轻这种威胁。其次,为了解决以前的一些答案:理解反思与安全之间的全面关系需要仔细关注细节并且对CAS系统的细节有很好的理解。之前发布的答案表明,由于反思而在安全和访问之间没有任何关联是错误的和错误的。

是的,反射允许您覆盖“可见性”限制(有时)。这并不意味着访问和安全之间没有任何联系。连接是使用反射来覆盖访问限制的权利以多种方式与CAS系统深深地联系在一起。

首先,为了这么做任意,代码必须由CAS系统授予私人反射许可。这通常只授予完全可信的代码,毕竟,这可能已经完成任何事情。其次,在新的.NET安全模型中,假设程序集A被CAS系统授予程序集B的授权集超集。在这种情况下,程序集A中的代码被允许使用反射来观察B的内部。第三,当你将动态生成的代码投入混合时,事情变得非常复杂。对于“跳过可视性”与“受限跳过可见性”之间的关系,以及在运行时代码被吐出的情况下,如何改变反射,访问控制和安全系统之间的交互,将会花费我更多的时间和空间有空。如果您需要详细信息,请参阅Shawn Farkas的博客。

6

不。这些与安全无关。反思打破了他们。

+1

这是误导。详情请参阅我的回答。 – 2009-05-21 16:10:04

+0

埃里克,OP做出了规定,“只要你有权访问Reflection”。是否存在代码可能访问Reflection的情况,但是无法访问私有,内部,受保护或受保护的内部成员和类型? – 2009-05-21 19:47:09

11

访问修饰符不是关于安全性,而是好的设计。适当的访问级别和方法驱动/执行良好的设计原则。理想情况下,只有在使用它的便利性比侵犯(如果有的话)最佳设计实践的成本提供更多实用性时才应该使用反思。密封类只是为了防止开发者扩展你的类并“破坏”它的功能。关于密封类的用途有不同的意见,但由于我做了TDD,很难嘲笑密封类,所以我尽可能地避免了这个问题。

如果你想要安全,你需要遵循编码实践,以防止坏人进入和/或保护机密信息免受检查,即使发生了中断。入侵防御,入侵检测,加密,审计等是您需要用来保护您的应用程序的一些工具。设置限制性访问修饰符和密封类与IMO的应用程序安全性无关。

1

关于反射和安全的注释 - 考虑到mscorlib.dll中有许多内部类型+成员调用本机Windows函数,并且如果恶意应用程序使用反射调用它们,可能会导致恶意。这不一定是个问题,因为不受信任的应用程序通常不会被运行时授予这些权限。这个(以及一些声明式安全检查)是mscorlib.dll二进制文件如何将其类型暴露给所有可信和不可信代码的方式,但不受信任的代码无法绕过公共API。

这实际上只是抓住了反射+安全问题的表面,但希望它有足够的信息来引导您走向正确的道路。

1

我总是试图将事情锁定到最小的访问需求。就像tvanfosson所说的那样,设计不仅仅是安全性。

例如,我将公开接口,我的实现内部,然后公共工厂类/方法来获取实现。这几乎迫使消费者总是将它作为接口输入,而不是实现。

这就是说,开发人员可以使用反射来实际实例化实现类型的新实例。没有什么阻止他/她。但是,我知道我至少在某种程度上很难违反设计。

相关问题