Php 如何阻止输出到浏览器的MySQL错误包含DB密码?

Php 如何阻止输出到浏览器的MySQL错误包含DB密码?,php,mysql,zend-framework,pdo,zend-db,Php,Mysql,Zend Framework,Pdo,Zend Db,当服务器出现MySQL配置或其他错误时,它会将MySQL用户名和密码打印到浏览器中。这是一种安全风险,因为如果SQL db不可用,它还将向浏览器打印密码 在本例中,我故意错误设置密码,以下是输出: 致命错误:未捕获异常 带有消息的“PDO异常” 'SQLSTATE[28000][1045]访问被拒绝 对于用户“用户名”@“本地主机”(使用 密码:YES)“”在 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Abst

当服务器出现MySQL配置或其他错误时,它会将MySQL用户名和密码打印到浏览器中。这是一种安全风险,因为如果SQL db不可用,它还将向浏览器打印密码

在本例中,我故意错误设置密码,以下是输出:

致命错误:未捕获异常 带有消息的“PDO异常” 'SQLSTATE[28000][1045]访问被拒绝 对于用户“用户名”@“本地主机”(使用 密码:YES)“”在 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Abstract.php:129 堆栈跟踪:#0 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Abstract.php(129): PDO->_构造('mysql:host=loca…', “drupal”、“密码”、数组)#1 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Mysql.php(96): Zend_Db_适配器_Pdo_抽象->_connect()#2 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Abstract.php(459): Zend_Db_适配器_Pdo_Mysql->_connect()#3 /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Abstract.php(238): Zend\u Db\u适配器\u抽象->查询('描述
site_…',Array)#4
/usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Mysql.php(156):
Zend_Db_Adapter_Pdo_Abstract->query('Descripte
site_…')5 /usr/local/zend/share/ZendFramework/library/zend/Db/Table/Abstract.php(823): Zend_Db_适配器_Pdo_Mysq in /usr/local/zend/share/ZendFramework/library/zend/Db/Adapter/Pdo/Abstract.php 在线144

下面是index.php文件中的当前配置代码

global $db;
if ($CFG->flagDBAdapters) {
    foreach ($config->db as $config_name => $database) {
        $dbAdapters[$config_name] = Zend_Db::factory($database->adapter,
        $database->config->toArray());
        if ((boolean) $database->default) {
            Zend_Db_Table::setDefaultAdapter($dbAdapters[$config_name]);
            $db = $dbAdapters[$config_name];
        }
    }
    Zend_Registry::set('dbAdapters', $dbAdapters);
我试着阅读更多关于PDO和插入的内容

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
这只是导致了一个不同的错误

致命错误:调用未定义的方法 Zend_Db_适配器_Pdo_Mysql::setAttribute() 在里面 /usr/local/zend/apache2/htdocs/source/index.php 在线301


有人能帮我指出我应该寻找的正确方向吗?

你可以用它来指定你自己的错误处理程序,在开发/测试过程中显示更详细的调试数据时,应该在生产中显示更友好的内容。

这更像是Zend Framework相关的问题,而不是一般的PHP问题。
因此,ZF应该有自己的方法来禁用这种行为


从PHP开始,应始终关闭生产服务器上的
显示\u错误设置

将@符号放在语句前面会抑制错误的输出。

事实上,这样的输出已经是使用自定义错误处理程序的结果。否,它的常规PHP错误位于
堆栈跟踪之前:
,其余是自定义错误处理程序。内置的错误处理程序永远不会打印db密码我相信这是未处理PDO异常的默认输出。这并不是由Zend框架引起的…@meagar我曾经使用PDO,它没有堆栈跟踪。我查看Zend,发现插入$message='';进入zend library Exception.php会停止该问题,但是修改框架是一种不好的做法<代码>类Zend_Db_适配器_异常扩展Zend_Db_异常{protected$\u chainedException=null;公共函数u构造($message='''.$code=0,Exception$e=null){if($e&&(0==$code)){$code=$e->getCode();}//添加$message='';在下面停止错误输出$message='';父项::_构造($message,$code,$e);}
请在尝试回答之前提高您的知识水平。将@符号放在语句前面根本不会引发错误。它与实际输出无关。而输出应使用其他方式进行控制。@Col Shrapnel:这相当误导。@在语句中将错误报告级别设置为0执行。如果报告级别为零,当然可以编写不产生错误的代码,但PHP本身会很高兴地继续产生错误,并且您仍然可以使用trigger_error()。不管怎样,仍然会调用任何自定义错误处理程序。@Paul我不相信这样有经验的程序员会说这样的废话“编写不引起错误的代码当然是可能的"。使用@没有任何意义,我不敢相信你会鼓吹它的用法。在这个领域,有些东西已经腐烂了……我不是在鼓吹它的用法,我只是认为值得指出的是,你的措辞有误导性,它表明PHP在内部检查报告级别是否为非零,然后决定提出错误。这是报告正在检查通常执行此检查的函数本身。是否尝试用Try-Catch语句包围导致错误的bloc。?