不使用OO封装会产生安全风险

本文关键字:安全 OO 封装 | 更新日期: 2023-09-27 18:01:51

这个问题可能听起来有些愚蠢,但我很想知道,如果暴露一个对象的字段,如公共,可以在我的应用程序中创建一个安全风险或漏洞,可以被其他人利用?

public class AClass
{
    public int AProperty { get; set; }
    //Less Secure?
    public int APublicField;
}

谢谢

不使用OO封装会产生安全风险

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

在c#中,你可以使用RTTI来反映私有数据,就像公共数据一样简单。由于c#的CLR和二进制兼容性保证,您甚至可以在自己的二进制文件中对外部二进制文件执行此操作。即使不能使用反射,攻击者也可以使用反汇编器并将代码作为中间语言进行检查。你也许想看看这篇文章。

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

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

安全性的最佳选择是进行研究并寻找使用良好的商业和开源库。密码学暴露得越多,库开发人员和白帽子就越能在漏洞被发现时合作修复。

代码片段中的两个"字段"本质上是等价的。第一个只是一个auto-property。因此,两者都不比另一个更"安全"。

实际上,setter和getter只是OOP的历史最佳实践。

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

然而,public属性的一个优点是代码较少,这有助于理解和维护代码。