信息太多,PHP错误?

信息太多,PHP错误?,php,mysql,security,sensitive-data,Php,Mysql,Security,Sensitive Data,例如,当MySQLi不可用时,我正在为mysql\uu函数制作一个自定义包装,当MySQLi无法连接时,它会抛出一个异常。但是,致命错误输出如下: 致命错误:未捕获的异常“exception”,消息为“失败” 连接到数据库。'inC:\ProgramFiles(x86)\Apache软件 Foundation\Apache2.2\htdocs\minipicket\database.php:16堆栈跟踪: C:\ProgramFiles(x86)\Apache软件 Foundation\Apac

例如,当MySQLi不可用时,我正在为
mysql\uu
函数制作一个自定义包装,当MySQLi无法连接时,它会抛出一个异常。但是,致命错误输出如下:

致命错误:未捕获的异常“exception”,消息为“失败” 连接到数据库。'in
C:\ProgramFiles(x86)\Apache软件
Foundation\Apache2.2\htdocs\minipicket\database.php
:16

堆栈跟踪:

C:\ProgramFiles(x86)\Apache软件
Foundation\Apache2.2\htdocs\MiniTicket\database.php
(49):
MySQL->u构造('localhost','miniticket','mtu:r!Nj@~qR6f9…)

#1
C:\ProgramFiles(x86)\Apache软件
Foundation\Apache2.2\htdocs\minipicket\index.php
(3):
require_once('C:\Program File…')

#2{main}在C:\Program中抛出 文件(x86)\Apache软件 Foundation\Apache2.2\htdocs\MiniTicket\database.php在线16

正如您所看到的,我的数据库密码清楚地显示给每个人看。不好的。我不想关闭这些消息,特别是在开发中,但我也不想显示敏感信息。使用
set\u error\u handler
也不是一个很好的解决方案,因为我必须解析所有内容,这很容易出错

所以。。。有没有一种简单的方法可以在错误消息中禁用函数中的参数显示,最好是通过PHP,而不是在某些配置文件中


编辑:除了文件名之外,禁用文件路径也是一个额外的好处。

您应该在生产和开发之间分离错误处理,其中开发显示错误信息,生产显示友好的错误消息,但不输出PHP所做的任何事。将输出记录到文件中。

编辑php.ini并设置

display_errors = 0
如果您无法访问php.ini,则需要在脚本顶部添加:

ini_set("display_errors", "0");
看到和

这将停止将所有错误输出到浏览器,并且可能只能在生产系统上执行。确保您仍在记录错误(通过php.ini设置)

我不确定为什么这不是默认配置,这样生产环境中就不会出现这种情况

但不要将此视为软件问题的解决方案,这只是为了阻止敏感数据向公众显示


请注意,您可能需要重新启动Apache才能使php.ini更改生效。

是否有可能捕获异常(并在收到“连接到数据库失败”时生成您自己的错误消息)?@nickb:我不希望这样做,因为该类无处不在,异常可能会以不同的方式处理。我想我可以改为
die
,但它感觉不太干净,尤其是在可以进行错误恢复的情况下。您可以随时捕获异常并抛出自己的异常,该异常只包含原始异常中的
Exception::getMessage
,它的堆栈跟踪中没有密码。如果主机既没有mysqli也没有PDO,则是时候切换主机了。@outis:这与主机无关。我正在制作开源软件,我需要在
database.php
中为各种RDBMS系统进行交换。好的,我来试试。有没有一种简单的方法可以转移消息?@minitech:您可以将所有错误转化为异常(这会使警告在默认情况下崩溃),然后使用自定义异常处理程序将其记录到文件中。您也可以使用PHP的
错误日志
@nickb请重新阅读并更新您的评论。我添加了一个注释,说明这只在生产环境中进行。谢谢是的,这是一种发展。。。这是一个不错的解决方案,但我更愿意隐藏开发时的消息。@minitech仅供参考,我通常在开发时关闭显示错误并
tail
日志文件。很明显,您处于windows环境中,因此我不知道这是否是您的替代方案。如果你想试试的话,谷歌“LinuxTailforWindows”。