在 OO 编程课程中,老师总是告诉我们将班级成员设置为私有,除非有充分的理由,因为它更“安全”。
将成员设置为私有如何使程序更安全?将班员公开的潜在威胁是什么?
在 OO 编程课程中,老师总是告诉我们将班级成员设置为私有,除非有充分的理由,因为它更“安全”。
将成员设置为私有如何使程序更安全?将班员公开的潜在威胁是什么?
实际上,将班级成员置于公共或私有状态与安全性无关。这个关于stackoverflow的答案很好地涵盖了它:
另请注意,在 Python 之类的语言中,只有一个约定以使用下划线开头的私有方法。然而,每个程序员仍然可以从另一个类访问这个方法。这个 Stackoverflow 问题很好地涵盖了这一点:为什么 Python 的“私有”方法实际上不是私有的?
在有限的特定情况下,现场可见性会产生影响。我说的是Java 小程序。一个未签名的 Java 小程序只能进行有限的系统交互(不能访问本地文件,不能连接到除了提供小程序代码的服务器之外的外部服务器,等等)。这些限制是通过一个复杂的“权限”框架来实施的,该框架在标准库的 Java 代码中实现。
如果一个applet 可以访问来自其他包的任意Java 对象的私有字段,那么它就可以修改为applet 本身定义当前权限的对象和表。实际上,在所有类(包括系统类)上使用反射 API的权利在技术上授予了小程序的所有权利。
这并不意味着字段可见性关键字喜欢private或是protected安全功能;这意味着 Sun/Oracle 的设计人员使用字段可见性来实现和支持安全框架(在我看来,他们应该不这样做,因为这样做就像试图维护一个“危险调用”的黑名单” 在数千个可能的调用上,这是非常艰苦的工作,Java 0-day 漏洞的反复出现证明了这种方法的硬度)。
对于大多数其他情况,对象字段应该是私有的,因为它促进了更好的软件工程实践,使代码更易于维护(就像所有规则一样,有例外;有时,公共字段是一个更好的主意)。这里没有关于安全的内容。它是关于可用性和可维护性的。
如果我们将类成员声明为私有,则只能在类内部访问它。因此,如果我们从安全的角度来看,将其声明为私有可以保护类成员。
如果成员方法被声明为私有,则不能使用对象访问成员方法。
如果成员变量是私有的,则不能访问它们。
因此,在程序中,如果您必须将某些值保密,例如加密密钥、其他凭据,则必须将其声明为私有。在某些情况下,如果您正在编写身份验证方法,将它们设为私有会增加一点安全性。