Php 为什么私有变量在对象中;可见的;来自外部世界?

Php 为什么私有变量在对象中;可见的;来自外部世界?,php,class,object,Php,Class,Object,举个例子: class Database { private $host, $database, $username, $password, $type; public $active_connection; //Some methods } class Page { private $db; public function __construc

举个例子:

class Database
{
    private $host,
            $database, 
            $username, 
            $password,
            $type;

    public $active_connection;

    //Some methods
}


class Page
{
    private $db;


    public function __construct($id)
    {
        // Some code

        $this->db = new Database($id);
    }

    //Some Methods
}


$page = new Page(0);

var_dump($page);
这将输出数据库对象的私有变量,即使它们被标记为私有(因此,据我所知,外部世界无法使用)

我的问题是:

  • 这是安全风险吗
  • 有没有办法有效地隐藏那些标记为私有的变量
  • 提前谢谢

    编辑:
    在这个项目中,管理部分将提供创建自定义PHP脚本的能力,以作为部分合并到站点中。由于这是开发给第三方实体的,我担心的是,出于某种原因,客户无意中转储了$page对象(在我们的代码中,它是主要的可修改对象),以便“浏览”它。

    var\u dump
    旨在让开发人员跟踪和调试代码。从:

    在PHP5中,对象的所有公共、私有和受保护属性都将在输出中返回


    封装是一种体系结构机制,不是一种安全措施,不能这样使用

    攻击者究竟如何利用这种安全风险?它只能从源代码内部访问,因此他也可以阅读您的受保护类的源代码,或者项目中的任何其他源代码

    此外,即使在C++中,也可以通过在对象中准备一个向右偏移的指针来访问私有成员。

    VARYDUMP]()显示它们,因为它很特殊。您还可以使用在私有/受保护的属性中进行挖掘

    echo$object->_somePrivateVar

    另一方面,将不会暴露_somePrivateVar

    1) 这是安全问题吗?一点也不。如果你不信任你正在执行的代码,那么你就相当于骨瘦如柴


    2) 隐藏他们什么?根据类系统的数据可见性规则,它们已经隐藏。但是这种语言是动态的,并且提供了一些其他的方式来窥视内部。正如Leonid在回答中所说,这是一种体系结构机制,而不是安全特性。

    这是
    var\u dump
    (以及
    print\u r
    var\u export
    )的记录行为。这是一种获得运行代码可见性的方法;例如,在调试它时,您可能想知道私有变量的值


    如果需要在另一个类中使用私有变量的内容,可以使用输出控制函数捕获输出,或者使用
    var\u export
    。这将是一种不寻常的情况:无论如何,在这种情况下,您很可能使用公共变量。如果您正在开发某种需要验证私有变量内容的测试套件,这将是您的答案。

    我知道这是一个老问题,但我想指出一种(相当)有效的隐藏变量的方法

    您可以在类内部创建一个包含静态变量的函数;如果您有一个变量,您确实觉得需要对系统本身进行隐藏,请将其保存到函数的静态变量中。只要该函数对类是私有的,就很难窥视其内部。如果出于某种原因,您的服务器正在将值转储到userland,而您无法控制它,则这是正常的

    但正如TimDev所说:如果您不信任正在执行的代码,这表明您存在一些更大的安全问题。即使你有一个基于插件的项目,其中有潜在的恶意pluin作者,你也无法在这个环境中保护自己。安装这些插件以确保安全性将取决于管理员。

    PHP 5.6中引入了新的魔法方法,允许您在转储对象时修改var_dump()的默认行为

    看一看这张照片

    示例:

    <?php
    class C {
        private $prop;
    
        public function __construct($val) {
            $this->prop = $val;
        }
    
        public function __debugInfo() {
            return [
                'propSquared' => $this->prop ** 2,
            ];
        }
    }
    
    var_dump(new C(42));
    ?>
    
    object(C)#1 (1) {
      ["propSquared"]=>
      int(1764)
    }
    

    尽管这个问题已经提出了3年,但我相信将来会有人发现它很有用。

    请查看
    \u debugInfo()
    如何隐藏堆栈跟踪中的敏感数据(在PHP 5.6.0中添加)。以下是一个例子:

    class PDO_Database
    {
        private $db_user = 'my_user';
        private $db_password = 'my_password';
    
        /**
         * The purpose of this method is to hide sensitive data from stack traces.
         *
         * @return array
         */
        public function __debugInfo()
        {
            $properties = get_object_vars($this);
    
            $hidden = [
                'db_user' => '***',
                'db_password' => '***',
            ];
    
            return $hidden + $properties;
        }
    }
    

    属性可见性没有安全功能。而
    var_dump
    恰好是一个调试功能。在这个项目中,管理部分将提供创建自定义PHP脚本的能力,以作为部分合并到站点中。由于这是开发给第三方实体的,我担心的是,出于某种原因,客户无意中转储了$page对象(在我们的代码中,它是主要的可修改对象),以便“探索”它。Ad 2)隐藏它们,例如,防止异常/错误报告,例如。然后,您可以使用magic方法
    \uuu debugInfo()
    来隐藏您的变量,使其不被var转储/导出/报告。