PHP print_r и статический член - PullRequest
1 голос
/ 31 июля 2009

У меня есть экземпляр объекта DB , который передается объекту Session , поскольку у объекта Session есть несколько методов, использующих DB объект для выполнения операторов SQL Я планировал сохранить этот DB объект в Session свойство объекта.

В ходе тестирования я обнаружил, что print_r выставил объект DB , сохраненный в свойстве объекта Session ; в вывод был включен db user / password.

Поэтому я хотел сохранить объект DB в частном статическом члене, чтобы предотвратить раскрытие этой информации при каждом вызове print_r объекта Session .

Это допустимо, или просто плохое использование статического члена?

Какой рекомендуемый способ предотвращения раскрытия свойства частного объекта во время print_r?

Вот пример кода.

До:

class Session 
{

    public __construct(DB $db)
    {
        $this->db = $db;
    }

}

После того, как:

class Session
{

    private static $db;

    pubic __construct(DB $db)
    {
        self::$db = $db;
    }

}

Ответы [ 3 ]

3 голосов
/ 31 июля 2009

Вы не можете помешать print_r / var_dump / var_export читать их, об этом несколько раз сообщалось команде php, но они считают это функцией (...):

http://bugs.php.net/bug.php?id=39118&edit=2
http://bugs.php.net/bug.php?id=35822&edit=1

Если вы используете статический член, такой как в вашем примере, помните, что каждый экземпляр Session может получить к нему доступ / имеет один и тот же; это может привести к некоторым неожиданностям позже.

Другая идея состоит в том, чтобы стереть логин / пароль от объекта БД после подключения, это может помочь устранить проблему.

0 голосов
/ 31 июля 2009

Другой подход заключается в изменении способа использования объекта БД. Если метод сеанса нуждается в использовании объекта DB, он должен вызвать «global $ db;» в начале метода, чтобы убедиться, что конфиденциальная информация для входа в БД на самом деле не является частью объекта $ _SESSION постоянных данных, и это зависит от вызывающей страницы, чтобы определить правильный объект $ db и не показывать его в течение жизни выполнение скрипта, не беспокоясь о том, что оно висит в объекте SESSION.

0 голосов
/ 31 июля 2009

Да, это плохо

print_r() следует использовать только для отладки, а не для отображения контента пользователю.

Если класс содержит секретную информацию, которая не должна быть видима для тестировщика, вы должны очистить (установить для полей пустую строку или что-то в этом роде) части, которые являются секретными.

...