如何防止PDO错误上的密码转储

时间:2014-01-08 17:35:36

标签: 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

我理解这个错误,但真正的问题是在堆栈跟踪中将数据库名称,登录名和密码转储到控制台中:

Stack trace:
#0 /var/www/libs/Database.php(15): PDO->__construct('mysql:host=conf...', 
'[db name]', '[db password]...', Array)

由于这是一个AJAX请求,它会转储到控制台浏览器中,这显然是一个问题。

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  • 始终在生产框中将display_errors设置为false。确保记录错误消息。

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

    • 捕获PDOException
    • 记录错误详情
    • 发送JSON数据通知存在错误,例如:

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