var_dump Объект класса php показывает имя пользователя и пароль базы данных

Я немного волнуюсь, когда я случайно var_dump() объект дочернего класса, результат показал все мои элементы sql и значения переменных, включая имя пользователя базы данных, пароль и имя DB. Есть ли проблема безопасности с этим. Если да, то как мне это защитить? Был бы благодарен, если бы кто-то показал мне свет на это.

$ClassObject=new MyChildClass();
var_dump($ClassObject);

Пример результата выглядит следующим образом:

object(MyChildClass)#1 (17) { ["database":protected]=> object(Crud)#2 (13) { ["lines"]=> string(12) "column_name" ["vals"]=> NULL ["query"]=> NULL ["table"]=> string(8) "users" ["DB_TYPE":"Database":private]=> string(5) "mysql" ["host":"База данных ":private]=> string(9) "localhost" ["user":"Database":private]=> string(4) "root" ["pass":"Database":private]=> string(7) "mypass" ["db":"База данных": private] => строка (13) "mydbname" ["conn":"База данных": private] => объект (PDO)#3 (0) { } ["ошибка ":" База данных ":private]=> NULL ["result"]=> NULL ["stmt":" База данных ": private] => объект (PDOStatement)#5 (1) { ["queryString"]=> строка (51) "SELECT имя_ столбца ОТ ms_users WHERE userid=:uid" } } ["loguserid":"Users":private]=> string(1) "4" ["rows"]=> array(0) { } ["vals"]=> NULL ["query"]=> NULL ["table"]=> string(16) "MyTable_name" ["DB_TYPE":"База данных":private]=> string(5) "mysql" ["host":"Database":private]=> string(9) "localhost" ["user":"Database":private]=> string(4) "root" ["pass":"Database":private]=> ул ing(7) "MyPass" ["db":"База данных": private] => строка (13) "mydbname" ["conn":"База данных": private] => NULL ["ошибка": "База данных": private] => NULL ["result"] => NULL ["stmt": "База данных":private]=> NULL ["join"]=> string(0) "" ["where"]=> string(35) "user_id=:id1 AND column_name=:id2" }

1 ответ

Волшебный метод http://php.net/__debugInfo делает именно это. В своем классе добавьте следующий код:

public function __debugInfo()
{
    $properties = get_object_vars($this);
    unset($properties['host']);
    unset($properties['user']);
    unset($properties['pass']);

    return $properties;
}

Как это работает: первая строка возвращает полный список свойств в текущем экземпляре. Затем с unsetмы удаляем все свойства, которые мы не хотим отображать var_dump,
Изменить код для удаления из $properties все свойства, которые вы хотите скрыть.

В этом первом примере все свойства, кроме 3, будут отображаться при использовании var_dump на этом объекте.

Или используйте более безопасный способ: создайте пустой массив и заполните его только теми свойствами, которые вы хотите отобразить:

public function __debugInfo()
{
    $properties = [];
    $properties[] = 'table';
    $properties[] = 'queryString';

    return $properties;
}

Во втором примере только 2 свойства будут отображаться при использовании var_dump на этом объекте.

Добавив этот метод ко всем своим классам, вы можете точно контролировать, что отображается при использовании var_dump,

Документация: http://php.net/__debugInfo

Другие вопросы по тегам