Php 为什么私有变量在对象中;可见的;来自外部世界?
举个例子:Php 为什么私有变量在对象中;可见的;来自外部世界?,php,class,object,Php,Class,Object,举个例子: class Database { private $host, $database, $username, $password, $type; public $active_connection; //Some methods } class Page { private $db; public function __construc
class Database
{
private $host,
$database,
$username,
$password,
$type;
public $active_connection;
//Some methods
}
class Page
{
private $db;
public function __construct($id)
{
// Some code
$this->db = new Database($id);
}
//Some Methods
}
$page = new Page(0);
var_dump($page);
这将输出数据库对象的私有变量,即使它们被标记为私有(因此,据我所知,外部世界无法使用)
我的问题是:
在这个项目中,管理部分将提供创建自定义PHP脚本的能力,以作为部分合并到站点中。由于这是开发给第三方实体的,我担心的是,出于某种原因,客户无意中转储了$page对象(在我们的代码中,它是主要的可修改对象),以便“浏览”它。
var\u dump
旨在让开发人员跟踪和调试代码。从:
在PHP5中,对象的所有公共、私有和受保护属性都将在输出中返回
封装是一种体系结构机制,不是一种安全措施,不能这样使用 攻击者究竟如何利用这种安全风险?它只能从源代码内部访问,因此他也可以阅读您的受保护类的源代码,或者项目中的任何其他源代码
此外,即使在C++中,也可以通过在对象中准备一个向右偏移的指针来访问私有成员。
VARYDUMP]()显示它们,因为它很特殊。您还可以使用在私有/受保护的属性中进行挖掘
echo$object->_somePrivateVar 另一方面,将不会暴露_somePrivateVar 1) 这是安全问题吗?一点也不。如果你不信任你正在执行的代码,那么你就相当于骨瘦如柴2) 隐藏他们什么?根据类系统的数据可见性规则,它们已经隐藏。但是这种语言是动态的,并且提供了一些其他的方式来窥视内部。正如Leonid在回答中所说,这是一种体系结构机制,而不是安全特性。这是
var\u dump
(以及print\u r
和var\u export
)的记录行为。这是一种获得运行代码可见性的方法;例如,在调试它时,您可能想知道私有变量的值
如果需要在另一个类中使用私有变量的内容,可以使用输出控制函数捕获输出,或者使用
var\u export
。这将是一种不寻常的情况:无论如何,在这种情况下,您很可能使用公共变量。如果您正在开发某种需要验证私有变量内容的测试套件,这将是您的答案。我知道这是一个老问题,但我想指出一种(相当)有效的隐藏变量的方法
您可以在类内部创建一个包含静态变量的函数;如果您有一个变量,您确实觉得需要对系统本身进行隐藏,请将其保存到函数的静态变量中。只要该函数对类是私有的,就很难窥视其内部。如果出于某种原因,您的服务器正在将值转储到userland,而您无法控制它,则这是正常的
但正如TimDev所说:如果您不信任正在执行的代码,这表明您存在一些更大的安全问题。即使你有一个基于插件的项目,其中有潜在的恶意pluin作者,你也无法在这个环境中保护自己。安装这些插件以确保安全性将取决于管理员。PHP 5.6中引入了新的魔法方法,允许您在转储对象时修改var_dump()的默认行为
看一看这张照片
示例:
<?php
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>
object(C)#1 (1) {
["propSquared"]=>
int(1764)
}
尽管这个问题已经提出了3年,但我相信将来会有人发现它很有用。请查看
\u debugInfo()
如何隐藏堆栈跟踪中的敏感数据(在PHP 5.6.0中添加)。以下是一个例子:
class PDO_Database
{
private $db_user = 'my_user';
private $db_password = 'my_password';
/**
* The purpose of this method is to hide sensitive data from stack traces.
*
* @return array
*/
public function __debugInfo()
{
$properties = get_object_vars($this);
$hidden = [
'db_user' => '***',
'db_password' => '***',
];
return $hidden + $properties;
}
}
属性可见性没有安全功能。而
var_dump
恰好是一个调试功能。在这个项目中,管理部分将提供创建自定义PHP脚本的能力,以作为部分合并到站点中。由于这是开发给第三方实体的,我担心的是,出于某种原因,客户无意中转储了$page对象(在我们的代码中,它是主要的可修改对象),以便“探索”它。Ad 2)隐藏它们,例如,防止异常/错误报告,例如。然后,您可以使用magic方法\uuu debugInfo()
来隐藏您的变量,使其不被var转储/导出/报告。