不使用OO Encapsulation会产生安全风险吗?

时间:2013-03-01 03:57:52

标签: c# security oop

这个问题可能听起来有些愚蠢,但我有好奇心知道,如果揭露像公众这样的对象的字段,可能会造成安全风险或者我的应用中可以被其他人利用的漏洞吗?

public class AClass
{
    public int AProperty { get; set; }

    //Less Secure?
    public int APublicField;
}

由于

3 个答案:

答案 0 :(得分:4)

访问修饰符(public,private,protected)只是一种机制,允许对具有源访问权限的人进行不同级别的封装。您应该将它们与OOP最佳实践结合使用,以使您的逻辑易于维护。它们与您的应用程序的安全性完全无关。

在C#中,您可以使用RTTI反映私有数据,就像公开一样容易。由于C#的CLR和二进制兼容性保证,您甚至可以在自己的外部二进制文件中执行此操作。即使您无法使用反射,攻击者也可以使用反汇编程序并将代码视为中间语言。您可能需要阅读此post

熟悉该平台的精明攻击者甚至可以寻找有关如何对运行内核级调试程序(如softICE)的应用程序进行反向工程的线索。

您总是可以尝试使用某种形式的security through obscurity来封装您的逻辑,以使执行不那么明显,但很明显,如果有人足够坚持,他们会找到一种方法。

安全性的最佳选择是进行研究并寻找商业和开源的常用库。密码学中的曝光越多,因为图书馆开发人员和白帽子可以在发现漏洞时协作修复漏洞。

答案 1 :(得分:1)

您的代码段中的两个“字段”基本上是等效的。第一个只是auto-property。因此,它们都不会比另一个更“安全”。

答案 2 :(得分:0)

事实上,制定者和吸气者只是OOP的历史最佳实践。

您公开的两个解决方案都不尊重封装,因为当您更改属性的名称或类型时,您必须在使用它的所有类中更改它。

但是,public属性的一个优点是可以减少代码,这有助于轻松理解和维护代码。