gpt4 book ai didi

php - Zend 数据库适配器 - 未捕获的异常 - 堆栈跟踪显示用户名和密码

转载 作者:可可西里 更新时间:2023-11-01 08:07:21 24 4
gpt4 key购买 nike

我正在使用 Zend_Db_Adapter,特别是 Zend_Db_Adapter_Pdo_Abstract。我想这个问题也会扩展到其他适配器。当抛出 PDOException 时,它是“未捕获的”,并且在许多情况下,堆栈跟踪会显示用户名和密码。

我已验证以下 PDO 异常都在堆栈跟踪中显示凭据:

  • SQLSTATE[HY000] [2005] 未知的 MySQL 服务器主机 ...snip...
  • SQLSTATE[HY000] [2013] 在“读取授权数据包”时与 MySQL 服务器失去连接
  • SQLSTATE[08004] [1040] 连接太多
  • SQLSTATE[28000] [1045] 用户 ...snip... 的访问被拒绝(使用密码:YES)

当出现错误时,我的生产站点不显示堆栈跟踪,我仍然希望在我的开发环境中看到这些错误的堆栈跟踪,我只是不想明文显示用户名和密码。

最佳答案

我会通过不解决它来解决这个问题......让我解释一下:

目前无法禁用未捕获异常的堆栈跟踪。 PHP 不允许您这样做。

因此,与其尝试禁用它,不如让异常未被捕获...我会安装一个 exception handler然后将记录回溯信息。我不会在屏幕上显示它。我不会检查它在哪个环境中。我不会检查请求信息。我只是将它记录到一个文件中,并显示一个通用的 500 服务器错误页面。

现在,在您的处理程序中,您可以有选择地显示调用信息,因此您可以选择是否记录参数信息:

set_exception_handler(function($exception) {
$log = array(
'message' => $exception->getMessage(),
'trace' => array(),
);
foreach ($exception->getTrace() as $item) {
$trace = isset($item['class']) ? $item['class'] . $item['type'] : '';
$trace .= $item['function'] . '()';
$log['trace'][] = $trace;
}
save_to_log($log);
});

但我将未捕获的异常视为您的应用程序中存在错误的标志。您应该找到它们并修复它们。如果你得到的足够多以至于你担心在页面中显示参数,那么你真的需要首先修复存在未捕获异常的事实......

编辑 下面是发生的情况的演示:

class Foo {
public function doSomething($user, $password) {
throw new Exception('Something Went Wrong!');
}
}

$f = new Foo();

$f->doSomething('user', 'passw');

on CodePad结果:

<br />
<b>Fatal error</b>: Uncaught exception 'Exception' with message 'Something Went Wrong!' in /code/MxH9Ls:4
Stack trace:
#0 /code/MxH9Ls(10): Foo-&gt;doSomething('user', 'passw')
#1 {main}
thrown in <b>/code/MxH9Ls</b> on line <b>4</b><br />

但是,使用异常处理程序(修改为打印而不是日志):

set_exception_handler(function($exception) {
$log = array(
'message' => $exception->getMessage(),
'trace' => array(),
);
foreach ($exception->getTrace() as $item) {
$trace = isset($item['class']) ? $item['class'] . $item['type'] : '';
$trace .= $item['function'] . '()';
$log['trace'][] = $trace;
}
echo $log['message'] . "\n";
foreach ($log['trace'] as $trace) {
echo " - $trace\n";
}
});

class Foo {
public function doSomething($user, $password) {
throw new Exception('Something Went Wrong!');
}
}

$f = new Foo();

$f->doSomething('user', 'passw');

On CodePad产生:

Something Went Wrong!
- Foo->doSomething()

关于php - Zend 数据库适配器 - 未捕获的异常 - 堆栈跟踪显示用户名和密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9278938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com