2013-03-01 64 views
0

这个问题也许听起来有些愚蠢,但我有好奇心要知道,如果暴露像公众一样的对象的字段,可能会在我的应用中创建安全风险或漏洞,并可能被其他人利用?不使用OO封装会产生安全风险?

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

    //Less Secure? 
    public int APublicField; 
} 

感谢

回答

4

访问修饰符(公共,私有,受保护)只是一种机制,允许对具有源访问权限的用户进行不同级别的封装。您应该将它们用于OOP最佳实践,以使您的逻辑易于维护。他们绝对与你的应用程序的安全无关。

在C#中,您可以使用RTTI像公开一样轻松地反映私人数据。感谢C#的CLR和二进制兼容性保证,您甚至可以在您自己的外部二进制文件中执行此操作。即使你不能使用反射,攻击者也可以使用反汇编程序并检查代码作为中间语言。您可能想要阅读这个post

熟悉该平台的敏捷攻击者甚至可能会寻找线索,了解如何对运行内核级调试器(如softICE)的应用程序进行逆向工程。

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

安全的最佳选择就是做你的研究,寻找使用良好的商业和开源的库。密码学越多,图书馆开发者和白帽就可以协作修复被发现的漏洞。

1

程式码中的两个 “场” 基本上是等价的。第一个只是一个auto-property。所以,两者都不是比另一方更“安全”。

0

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

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

但是,公共属性的一个优点是您获得的代码更少,这有助于轻松理解和维护代码。