我有一个 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;
}
}
答案 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对象中徘徊。