Php 如何防止PDO错误导致密码转储

Php 如何防止PDO错误导致密码转储,php,mysql,pdo,Php,Mysql,Pdo,我的MySQL数据库中有太多主机PDO异常: exception 'PDOException' with message 'SQLSTATE[HY000] [1129] Host '[IP ADDRESS]' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'' in /var/www/libs/Database.php:15 我理解这个错误,但真正的问题在于堆栈跟踪,它

我的MySQL数据库中有太多主机PDO异常:

 exception 'PDOException' with message 'SQLSTATE[HY000] [1129] Host 
'[IP ADDRESS]' is blocked because of many connection errors; unblock 
 with 'mysqladmin flush-hosts'' in /var/www/libs/Database.php:15
我理解这个错误,但真正的问题在于堆栈跟踪,它将数据库名称、登录名和密码转储到控制台中:

Stack trace:
#0 /var/www/libs/Database.php(15): PDO->__construct('mysql:host=conf...', 
'[db name]', '[db password]...', Array)
由于这是一个AJAX请求,它会转储到控制台浏览器中,这显然是一个问题

我怎样才能避免这种情况发生?我是否错误地配置了PHP

由于这是一个AJAX请求,它将转储到控制台浏览器中

当然,PHP(和其他服务器端语言一样)是在另一台计算机上执行的,不能访问浏览器的控制台。最有可能的是,PHP和JavaScript都不是为优雅地处理错误条件而设计的。一些提示:

  • 在生产框中始终将“显示错误”设置为false。请确保改为记录错误消息

  • 调整服务器端代码,使其即使在数据库关闭时也能生成有效的输出。例如,如果脚本应该生成JSON,那么即使出现错误,它也应该发送JSON数据。为此:

    • 捕获
      pdo异常
    • 记录错误详细信息
    • 发送JSON数据,通知存在错误,例如:

      {"status": "error", "info": "Database is down"}
      
  • 调整客户端代码以处理AJAX响应中的任何类型的错误,包括status=error的正确JSON和缺少正确JSON


错误日志中没有MySQL密码真的很重要吗?如果攻击者有权访问日志,他还可以访问您的
/var/www/libs/Database.php
,如果他想。。。在我看来,只要日志留在服务器上,并且不与任何人共享(通过电子邮件或其他方式),就可以了。更好地处理错误。PDO抛出
PDOException
的实例,因此捕获这些实例并优雅地处理它们。任何原始错误消息都不应输出到生产网站上,而应使用不可公开访问的错误日志文件。@André这是一个AJAX请求,因此转储到浏览器控制台Relevant中。捕获异常或将错误报告设置配置为不可见地输出错误。可能存在重复的