【发布时间】:2016-01-08 15:41:10
【问题描述】:
我注意到我的开发服务器的 php_errors.log 文件在我之前的错误修复狂欢之后重新出现,但这次我注意到一些相当令人不安的事情......
[06-Jan-2016 01:29:29 UTC] PHP 致命错误:未捕获的 PDOException:SQLSTATE[HY000] [2002] /home/niet/public_html/classes/DB.class.php 中没有此类文件或目录:14
堆栈跟踪:
#0 /home/niet/public_html/classes/DB.class.php(14): PDO->__construct('mysql:host=loca...', 'niet', '我的实际密码!强>',数组)
#1 /home/niet/public_html/classes/DB.class.php(47): DB::connect()
#2 ...
不用说,这是一个问题。所以基本上,我的问题很简单:
如何将字符串传递给函数,如果出现问题,它不会显示在堆栈跟踪中?
为了聪明,我尝试了这个:
new PDO(
"mysql:host=localhost.....",
"niet",
new class { public function __toString() { return "correct horse battery staple"; }}
);
虽然它成功连接到数据库,但抛出的异常(例如错误密码)仍然显示字符串值,而不是匿名类。如果我使用“普通”类尝试从跟踪中“隐藏”变量,则会出现类似问题。
【问题讨论】:
-
xkcd 参考 +1。为什么堆栈跟踪中的密码会出现问题?当然,有权访问服务器日志的人也有权访问配置文件?
-
也许您可以使用 try 和 catch.. php.net/manual/en/language.exceptions.php 并在生产中始终禁用 error_reporting..
-
@JimL 虽然这是真的,但我不喜欢可能需要保持安全的信息最终被丢弃在不应该出现的地方的想法。例如,这里是我的 DB 密码,但如果是用户的帐户密码在跟踪中结束了怎么办?还是他们的个人信息?
-
您确定不会将用户密码存储在数据库中吗?
-
简单的答案——你不能将一个字符串传递给一个函数,这样它就不会显示在堆栈跟踪中——尽管你可以稍微配置一下 PDO。您还可以提出您无法防范的不同灾难场景,这些场景可能会破坏时空结构。到目前为止,您肯定知道,您可以做的是使用已知的最佳实践来最大程度地减少安全问题 - 例如,我将使用 SSL 和 MySQL 密码(不是 HTTP SSL,而是 PHP > MySQL SSL)
标签: php