访问级别和修饰符(私有,密封等)是否在C#中起到安全作用?

Mat*_*tin 11 c# security sealed

我已经看到你可以使用反射来操纵私人和内部成员.我也看到它说'密封'类更安全,而不是.

修饰语"公开,受保护,内部,私有,抽象,密封,只读"只不过是绅士对设计和API使用的一致意见,只要您能够获得反思,就可以打破它们吗?如果黑客已经在运行调用你的API的代码,游戏就已经丢失了,对吗?

以下是否比任何其他类更安全?

//private class
sealed class User
{
    private string _secret = "shazam";
    public readonly decimal YourSalary;
    public string YourOffice{get;};
    private DoPrivilegedAction()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 28

首先,回答你的问题:安全系统旨在保护好用户免受恶劣代码的影响 ; 它明确地不是为了保护好的代码免受不良用户的侵害.您的访问限制可以缓解部分受信任的恶意代码对用户攻击.它们不会减轻来自恶意用户的代码攻击.如果威胁是恶意用户获取您的代码,那么您就有一个大问题.安全系统根本不会减轻这种威胁.

其次,要解决以前的一些答案:理解反思和安全之间的完整关系需要仔细关注细节并充分理解CAS系统的细节.先前发布的答案表明,由于反射而在安全性和访问之间没有任何关联,这是错误的和错误的.

是的,反射允许您覆盖"可见性"限制(有时).这并不意味着访问和安全之间没有联系.连接是使用反射来覆盖访问限制的权利以多种方式与CAS系统密切相关.

首先,为了任意执行此操作,CAS系统必须授予代码私有反射权限.这通常仅授予完全受信任的代码,毕竟,这些代码已经可以执行任何操作.

其次,在新的.NET安全模型中,假设程序集A被CAS系统授予程序集B的授权集的超集.在这种情况下,程序集A中的代码允许使用反射来观察B的内部.

第三,当你将动态生成的代码投入到混合中时,事情变得非常复杂.解释"跳过可见性"与"受限制的跳过可见性"的工作方式,以及它们如何在运行时吐出代码的情况下改变反射,访问控制和安全系统之间的交互,这将比我花费更多的时间和空间有空的.如果您需要详细信息,请参阅Shawn Farkas的博客.


tva*_*son 11

访问修饰符不是安全性,而是良好的设计.类和方法的适当访问级别驱动/强制执行良好的设计原则.理想情况下,只有在使用它的便利性提供比违反(如果有的话)最佳设计实践的成本更多的实用性时,才应该使用反射.密封类仅用于防止开发人员扩展您的类并"破坏"它的功能.关于密封类的效用有不同的意见,但由于我做TDD并且很难模拟密封类,我尽可能地避免它.

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


Joh*_*ers 6

不,这些与安全无关.反思打破了他们所有.