PHP - public 可见性是否不太安全?
PHP - Is public visibility less secure?
我曾经问过一位老师,为什么她总是将属性可见性设置为私有或受保护。她回答我说这比设置 public 更安全,但我对这个答案不太有信心。所以,我想知道,即使我确保最终用户无法以任何方式操纵我的 类,Public 属性 的属性真的不那么安全吗?为什么?
不,那绝对是垃圾。它不安全也不安全。
如果用户愿意,他们可以访问对象上的 protected/private 属性:
class Car {
protected $engine = 'V8';
}
$reflector = new ReflectionClass('Car');
$engineProperty = $reflector->getProperty('engine');
$engineProperty->setAccessible(true);
$maserati = new Car;
echo $engineProperty->getValue($maserati); // echoes "V8"
$engineProperty->setValue($maserati, 'I4');
echo $engineProperty->getValue($maserati); // echoes "I4"
因此,很明显,没有安全优势。
好处是它可以帮助最终用户标记 class 为他们设计的交互功能和属性。如果开发人员愿意,他们可以完全改变 class 的内部结构,但调用它的代码不必更改。如果他们真的想要,class的用户可以随意处理它,但如果事情不起作用,那就是他们的问题了!
这与安全无关。 封装可能是you/your老师要找的词
见What is encapsulation? How does it actually hide data?
Public 属性本身并不像其他答案所指出的那样更安全或更不安全。但是拥有许多 public 属性会间接导致应用程序的安全性降低。例如:
具有许多 public 属性的 类 更难推理,因为这些属性可以由代码的任何其他部分操作,而不仅仅是由他自己的方法操作。这样,整个应用程序的安全性就会变得更难管理。
换句话说:public 属性可以导致更大的 attack surface。
继承是另一个受封装影响的领域。
通过扩展带有子 class 的基础 class,通常可以将新功能添加到应用程序中。受雇从事软件项目的新开发人员通常使用其他开发人员创建的 classes 的 public 方法。
如果一个方法被错误地声明为 public 那么它可以被未来的开发者覆盖
我曾经问过一位老师,为什么她总是将属性可见性设置为私有或受保护。她回答我说这比设置 public 更安全,但我对这个答案不太有信心。所以,我想知道,即使我确保最终用户无法以任何方式操纵我的 类,Public 属性 的属性真的不那么安全吗?为什么?
不,那绝对是垃圾。它不安全也不安全。
如果用户愿意,他们可以访问对象上的 protected/private 属性:
class Car {
protected $engine = 'V8';
}
$reflector = new ReflectionClass('Car');
$engineProperty = $reflector->getProperty('engine');
$engineProperty->setAccessible(true);
$maserati = new Car;
echo $engineProperty->getValue($maserati); // echoes "V8"
$engineProperty->setValue($maserati, 'I4');
echo $engineProperty->getValue($maserati); // echoes "I4"
因此,很明显,没有安全优势。
好处是它可以帮助最终用户标记 class 为他们设计的交互功能和属性。如果开发人员愿意,他们可以完全改变 class 的内部结构,但调用它的代码不必更改。如果他们真的想要,class的用户可以随意处理它,但如果事情不起作用,那就是他们的问题了!
这与安全无关。 封装可能是you/your老师要找的词
见What is encapsulation? How does it actually hide data?
Public 属性本身并不像其他答案所指出的那样更安全或更不安全。但是拥有许多 public 属性会间接导致应用程序的安全性降低。例如:
具有许多 public 属性的类 更难推理,因为这些属性可以由代码的任何其他部分操作,而不仅仅是由他自己的方法操作。这样,整个应用程序的安全性就会变得更难管理。
换句话说:public 属性可以导致更大的 attack surface。
继承是另一个受封装影响的领域。
通过扩展带有子 class 的基础 class,通常可以将新功能添加到应用程序中。受雇从事软件项目的新开发人员通常使用其他开发人员创建的 classes 的 public 方法。
如果一个方法被错误地声明为 public 那么它可以被未来的开发者覆盖