当我偶然var_dump()
子类的对象时,我有点担心,结果显示了我的所有sql元素和变量值,包括数据库用户名,密码和DBname。是否存在安全问题。如果是,我该如何屏蔽它?如果有人向我展示了它,我将感激不尽。
$ClassObject=new MyChildClass();
var_dump($ClassObject);
样本结果如下: -
object(MyChildClass)#1(17){[" database":protected] =>对象(CRUD)#2 (13){[" rows"] => string(12)" column_name" ["瓦尔斯"] => NULL [" query"] => NULL [" table"] => string(8)" users" [" DB_TYPE":"数据库":私人] => string(5)" mysql" ["主机":"数据库":私人] => string(9)" localhost" ["用户":"数据库":私人] => string(4)" root" ["通过":"数据库":私人] => string(7)" mypass" ["分贝":"数据库":私人] => string(13)" mydbname" ["康恩":"数据库":私人] =>对象(PDO)#3(0){} ["错误":"数据库":私人] => NULL ["结果"] =>空值 ["语句":"数据库":私人] =>对象(PDOStatement)#5(1){ ["的queryString"] => string(51)" SELECT column_name FROM ms_users WHERE 用户ID =:UID" }" loguserid":"用户":私人] =>字符串(1)" 4" ["行"] => array(0){} [" vals"] => NULL [" query"] => NULL [" table"] => string(16)" MyTable_name" [" DB_TYPE":"数据库":私人] =>串(5) " MySQL的" ["主机":"数据库":私人] => string(9)" localhost" ["用户":"数据库":私人] => string(4)" root" ["通过":"数据库":私人] => string(7)" MyPass" ["分贝":"数据库":私人] => string(13)" mydbname" ["康恩":"数据库":私人] => NULL ["错误":"数据库":私人] =>空值 ["导致"] => NULL [" stmt":"数据库":私人] => NULL [" join"] => string(0)"" ["其中"] => string(35)" user_id =:id1 AND 列名=:ID2" }
答案 0 :(得分:3)
魔术方法__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