【发布时间】:2018-04-22 19:47:35
【问题描述】:
我知道私有属性只能由类本身访问,而受保护的属性可以由类和扩展它的类访问。假设我有这样的课程:
class Example {
protected $sensitive;
public function __construct($data) {
$this->sensitive = $data;
}
}
当使用var_dump 时,所有属性都列在转储中,我知道可以使用__debugInfo 隐藏属性,如下所示:
public function __debugInfo() {
$result = get_object_vars($this);
unset($result['sensitive'];
return $result;
}
但我只是想知道这样存储数据是否是不好的做法?我将举例说明我的一种情况:
我有一个配置文件,用于存储不同数据库的各种数据库登录凭据。
当 App 类被实例化时,一个 Database 类被实例化并添加到一个 Container 中。然后在连接文件中调用 Database 类中的一个方法,该方法将所有这些数据库连接详细信息添加到 Database 类中的受保护属性中,以供以后“即时”连接到数据库时使用。
显然,Database 类中的这个受保护的属性将所有数据库的所有潜在登录详细信息都存储在一个地方,这让我很担心,我可能什么都不担心,但有这样的想法会很好知道这是否不好。
对我来说,最终用户看到这些数据的唯一方法是,如果我不小心将var_dump 留在了实时网站的某个地方让他们看到?
【问题讨论】:
-
据我所知,可以将凭据存储为属性,唯一可以读取它们的方法是如果他可以访问文件,如果他可以这样做,他只会从任何文件。
-
这就是我希望听到的,谢谢!
-
只需将配置文件(凭据所在的位置)存储在您的 Web 根目录之外,这样公众就无法访问它。 (以防出现问题并且您的服务器开始转储 PHP 代码)。检查:stackoverflow.com/questions/24787953/…
-
我想你已经在这里大部分回答了你自己的问题。如果任何人都可能访问源代码,那么在类 definition 中存储敏感变量是危险的。当且仅当您不小心在代码中留下
var_dump/etc 调用时,将其存储在在运行时 的对象中是危险的。从理论上讲,如果有人可以访问您的运行时,那么他们可以从当前正在执行的脚本中提取一个变量,但如果是这种情况,那么您可能会遇到更大的问题。 -
@Mehdi 是的,存储实际硬编码凭据的 config .env 文件已经在公共目录之外,所以我在那里。