打印类的实例化会暴露私有变量

时间:2013-03-12 14:23:46

标签: php security oop

在PHP中,我创建了一个包含私有声明变量的类。

class testClass {
   private $_db_name = 'test_db';
   private $_db_user = 'test_user';
   private $_db_pass = 'test_pass';
}

无意中,在实例化类之后,我在我设置的变量上运行print_r,并将这些私有变量打印到屏幕上。

$test = new testClass();
print_r($test);

返回:

testClass Object
(
    [_db_name:testClass:private] => test_db
    [_db_user:testClass:private] => test_user
    [_db_pass:testClass:private] => test_pass
)

这对我来说有点担心。如果我在我的服务器上打包了一个包含敏感信息的类,供其他人包含和使用而无需访问密码等,他们可以直接转储这些。我错过了一些关键的东西来防止这种行为发生吗?有没有更好的方法来处理对象中的敏感信息?

2 个答案:

答案 0 :(得分:1)

将成员设置为私有并不意味着您看待它的方式的安全性(即隐藏敏感数据)。它只是对使用扩展类或整个应用程序中的成员的其他人(开发人员)的安全性。

意味着保护数据不会与无法看到数据的人共享。如果您不希望其他人看到它,请不要将其包含在其他人正在使用的代码中。

长话短说。可见性只是为了防止初级开发人员搞砸或弄乱你的代码。 ; - )

答案 1 :(得分:0)

如果他们可以访问PHP代码,他们可以访问其中的所有内容。您可以通过不将它们声明为变量但在print_r

中处理变量来防止它出现在final public function __get($prop)函数中
final public function __get($prop) {
  switch ($prop) {
    case "_db_name":
     return 'test_db';

  }

  return $this->$prop; //this also works on all private vars, so you might want some extra checking.
}

但话又说回来,如果我可以像require('your/package/file.php')一样添加你的软件包那么是什么阻止我做echo implode('', file('your/package/file.php'));看到它呢?