当我偶然var_dump()
一个子类的对象时,我有点担心,结果显示了我所有的sql元素和变量值,包括数据库用户名、密码和DBname。它有安全问题吗?如果有,我该如何保护它?如果有人给我看一盏灯,我会很感激。
$ClassObject=new MyChildClass();
var_dump($ClassObject);
样本结果如下:-
object(MyChildClass)#1(17){["database":protected]=>object(Crud)#2(13) {["rows"]=>string(12)"column_name"["vals"]=>NULL["query"]=>NULL["table"]=>string(8)"users"["DB_TYPE":"Database":private]=>string(5)"mysql"["host":"Database":private]=>string(9)"localhost"["user":"Database":private]=>string(4)"root"["pass":"Database":private]=>string(7)"mypass"["db":"Database":private]=>string(13)"mydbname"["conn":"Database":private]=>对象(PDO)#3(0){}["error":"Database":private]=>NULL["result"]=>NULL["stmt":"Database":private]=>对象(PDOStatement)#5(1){["queryString"]=>string(51)"SELECT column_name FROM ms_users WHEREuserid=:uid"}}["loguserid":"Users":private]=>string(1)"4"["行"]=>数组(0){}["vals"]=>NULL["query"]=>NULL["table"]=>string(16)"MyTable_name"["DB_TYPE":"Database":private]=>string(5)"mysql"["host":"Database":private]=>string(9)"localhost"["user":"Database":private]=>string(4)"root"["pass":"Database":private]=>string(7)"MyPass"["db":"Database":private]=>string(13)"mydbname"["conn":"Database":private]=>NULL["error":"数据库":private]=>NULL["result"]=>NULL["stmt":"Database":private]=>NULL"join"]>>string(0)"["其中"]=>string(35)"user_id=:id1 ANDcolumn_name=:id2"}
神奇的方法__debugInfo就是这么做的。在你的课堂上,添加以下代码:
public function __debugInfo()
{
$properties = get_object_vars($this);
unset($properties['host']);
unset($properties['user']);
unset($properties['pass']);
return $properties;
}
工作方式:第一行检索当前实例中的完整属性列表。然后,使用unset
,我们删除了var_dump
不希望显示的所有属性
修改代码以从$properties
中删除所有要隐藏的属性。
在第一个示例中,在此对象上使用var_dump
时,将显示除3以外的所有属性。
或者使用一种更安全的方法:创建一个空数组,并只使用您想要显示的属性填充它:
public function __debugInfo()
{
$properties = [];
$properties[] = 'table';
$properties[] = 'queryString';
return $properties;
}
在第二个示例中,当对此对象使用var_dump
时,将只显示2个属性。
通过将此方法添加到所有类中,可以准确地控制使用var_dump
时显示的内容。
文档:__debugInfo