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