PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php-Zend数据库适配器-未捕获的异常-堆栈跟踪显示用户名和密码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用Zend_Db_Adapter,特别是Zend_Db_Adapter_Pdo_Abstract.我可以想象这个问题也会扩展到其他适配器.引发PDOException时,将其“未捕获”,并且在许多情况下,堆栈跟踪会显示用户名和密码.

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

> sqlSTATE [HY000] [2005]未知的MySQL服务器主机…片段…
> sqlSTATE [HY000] [2013]在“读取授权包”时与MysqL服务器的连接断开
> sqlSTATE [08004] [1040]连接太多
> sqlSTATE [28000] [1045]用户… snip …的访问被拒绝(使用密码:是)

我的生产站点在出现错误不显示堆栈跟踪,并且我仍然希望在开发环境中查看这些错误的堆栈跟踪,只是不希望用户名和密码清晰显示.

解决方法:

我不解决解决了…让我解释一下:

当前没有办法从未捕获的异常中禁用堆栈跟踪. 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);
});
@H_618_26@

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

编辑这是发生的情况的演示:

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

$f = new Foo();

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

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 />
@H_618_26@

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

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');
@H_618_26@

On CodePad产生:

Something Went Wrong!
 - Foo->doSomething()
@H_618_26@

大佬总结

以上是大佬教程为你收集整理的php-Zend数据库适配器-未捕获的异常-堆栈跟踪显示用户名和密码全部内容,希望文章能够帮你解决php-Zend数据库适配器-未捕获的异常-堆栈跟踪显示用户名和密码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: