这个问题可能听起来有些愚蠢,但我很想知道,如果公开像 publics 这样的对象的字段,是否会在我的应用程序中造成安全风险或漏洞,从而被其他人利用?
public class AClass
{
public int AProperty { get; set; }
//Less Secure?
public int APublicField;
}
谢谢
访问修饰符(公共、私有、受保护)只是一种机制,允许对具有源访问权限的人进行不同级别的封装。您应该将它们与 OOP 最佳实践一起使用,以使您的逻辑易于维护。它们与您的应用程序的安全性完全无关。
在 C# 中,您可以像使用公共数据一样轻松地使用 RTTI 来反映私有数据。由于 C# 的 CLR 和二进制兼容性保证,您甚至可以在自己的外部二进制文件上执行此操作。即使您不能使用反射,攻击者也可以使用反汇编程序并将代码作为中间语言进行检查。您可能想阅读这篇文章。
熟悉该平台的精明攻击者甚至可以寻找有关如何逆向工程运行内核级调试器(如softICE )的应用程序的线索。
您总是可以尝试通过封装您的逻辑来尝试通过模糊使用某种形式的安全性,以试图使执行不那么明显,但显然如果有人足够持久,他们会找到一种方法。
安全性的最佳选择是进行研究并寻找使用良好的商业和开源库。密码学的曝光率越高越好,因为库开发人员和白帽可以在发现漏洞时协作修复漏洞。
您的代码段中的两个“字段”本质上是等效的。第一个只是一个auto-property。因此,两者都不比另一个更“安全”。
实际上,setter 和 getter 只是 OOP 的历史最佳实践。
您公开的两种解决方案都不尊重封装,因为当您更改属性的名称或类型时,您必须在使用它的所有类中更改它。
但是,public 属性的一个优点是您获得的代码更少,这有助于轻松理解和维护代码。