【问题标题】:var_dump a php Class object reveals database username and passwordvar_dump 一个 php 类对象显示数据库用户名和密码
【发布时间】:2016-07-17 21:57:28
【问题描述】:

当我偶然var_dump()一个子类的对象时,我有点担心,结果显示了我所有的sql元素和变量值,包括数据库用户名、密码和数据库名。是否存在安全问题。如果是,我该如何屏蔽它?如果有人给我指点一下,将不胜感激。

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

示例结果如下:-

object(MyChildClass)#1 (17) { ["database":protected]=> object(Cru​​d)#2 (13) { ["rows"]=> 字符串(12) "column_name" ["vals"]=> NULL ["query"]=> NULL ["table"]=> string(8) "users" ["DB_TYPE":"Database":private]=> 字符串(5)“mysql”[“主机”:“数据库”:私有]=>字符串(9)“本地主机” ["user":"Database":private]=> string(4) "root" ["pass":"Database":private]=> string(7) "mypass" ["db":"Database":private]=> 字符串(13) "mydbname" ["conn":"Database":private]=> 对象(PDO)#3 (0) { } [“错误”:“数据库”:私有]=> NULL [“结果”]=> NULL ["stmt":"Database":private]=> object(PDOStatement)#5 (1) { ["queryString"]=> string(51) "SELECT column_name FROM ms_users WHERE userid=:uid" } } ["loguserid":"Users":private]=> string(1) "4" ["rows"]=> array(0) { } ["vals"]=> NULL ["query"]=> NULL ["table"]=> 字符串(16)“MyTable_name”[“DB_TYPE”:“数据库”:私有]=>字符串(5) "mysql" ["host":"Database":private]=> string(9) "localhost" ["user":"Database":private]=> string(4) "root" ["pass":"Database":private]=> string(7) "MyPass" ["db":"Database":private]=> 字符串(13) "mydbname" ["conn":"Database":private]=> NULL ["error":"Database":private]=> NULL ["result"]=> NULL ["stmt":"Database":private]=> NULL ["join"]=> string(0) "" ["where"]=> string(35) "user_id=:id1 AND column_name=:id2" }

【问题讨论】:

    标签: php database class object var-dump


    【解决方案1】:

    魔术方法__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

    【讨论】:

    • 谢谢!乔斯林,我明白了。
    猜你喜欢
    • 2014-10-29
    • 2018-02-13
    • 2016-02-05
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多