我注意到我的开发服务器的php_errors.log文件在我之前的bug修复狂欢之后又重新出现了,但这次我注意到了一些令人不安的事情......
[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&#39 ;,' MY ACTUAL PASSWORD!',数组)
#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"; }}
);
当它成功连接到数据库时,抛出的异常(例如错误的密码)仍然显示字符串值,而不是匿名类。如果我使用"正常"会发生类似的问题。上课,试试"隐藏"跟踪中的变量。
答案 0 :(得分:0)
在高效环境中,您应该禁用任何错误消息。在PHP.ini文件中设置display_errors = off
,以便不显示有关服务器的任何详细信息。
此外,您可以将$pdo->setAttribute(PDO::ERRMODE_SILENT)
设置为静音PDO。您可以查看manual以获取更多错误代码。
//编辑:错误仍然可以以静默方式记录:
$pdo = new PDO($server, $user, $password);
// Let us assume that 'foo' column does not exist
$query = 'SELECT foo FROM bar';
$result = $pdo->query($query);
// Log error message
if ($pdo->errorInfo()) {
print_r($pdo -> errorInfo());
}
答案 1 :(得分:0)
您可以设置自己的异常处理程序,只打印异常消息而不是堆栈跟踪,例如
function exception_handler($e) {
echo "<b>Exception in file: </b>" . $e->getFile() . "<br>";
echo "<b>Exception on line: </b>" . $e->getLine() . "<br>";
echo "<b>Exception message: </b>" . $e->getMessage();
}
set_exception_handler('exception_handler');
因此,您仍然会收到有用的错误消息,但不包含任何敏感数据:
文件中的异常: C:\ xampp \ htdocs \ path \ file.php
在线例外: 220
异常消息: SQLSTATE [HY000] [1045]用户'root'@'localhost'拒绝访问(使用&gt;密码:是)