PHP print_r和静态成员

时间:2009-07-31 14:25:18

标签: php static visibility

我有一个 DB 对象的实例,它被传递给 Session 对象,因为 Session 对象有几个方法可以使用 DB 对象执行SQL语句我计划将此 DB 对象存储在 Session 对象属性中。

通过测试,我发现print_r公开了存储在 Session 对象属性中的 DB 对象;包含在输出中的是db用户/密码。

所以我的想法是将 DB 对象存储在私有静态成员中,以防止在 Session 上调用print_r时泄露此信息对象

这是可以接受的,还是仅仅使用静态成员?

print_r期间,有什么建议的防止私有对象属性泄露的方法?

这是代码示例。

之前:

class Session 
{

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

}

后:

class Session
{

    private static $db;

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

}

3 个答案:

答案 0 :(得分:3)

你无法阻止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实例都可以访问它/具有相同的;这可能会在以后产生一些意外。

另一个想法是在连接后清除DB对象的登录/传递,这可以帮助解决问题。

答案 1 :(得分:0)

是的,这很糟糕

print_r()只应用于调试,而不能用于向用户显示内容。

如果该类包含测试人员无法看到的秘密信息,则必须清理(将字段设置为空字符串或其他内容)秘密部分。

答案 2 :(得分:0)

另一种方法是修改您使用DB对象的方式。如果会话方法需要使用DB对象,则应调用“global $ db;”在方法的开头,以确保敏感的DB登录信息实际上不是持久数据的$ _SESSION对象的一部分,并且由调用页面定义一个正确的$ db对象,并且在生命期间不暴露它脚本的执行,不用担心它在SESSION对象中徘徊。