2014-01-08 23 views
2

我有太多的主机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吗?

+3

错误日志中没有MySQL密码真的很重要吗?如果攻击者能够访问日志,他也可以访问你的'/ var/www/libs/Database.php',并且如果他想要的话可​​以很容易地获得密码......在我看来,我会说只要由于日志保留在服务器上,并且不会与任何人共享(通过电子邮件或其他方式),所以没关系。 – 2014-01-08 17:38:25

+7

更好地处理错误。 PDO抛出'PDOException'的实例,所以抓住这些并优雅地处理它们。任何原始错误消息都不应该在生产网站上输出,而应该使用不可公开访问的** error_log **文件。 –

+0

@André这是一个AJAX请求,因此转储到浏览器控制台 – alias51

回答

2

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

当然,PHP(像其他服务器端语言)在另一台计算机上执行,并没有访问到浏览器的安慰。很可能,您的PHP和您的JavaScript都不是用来优雅地处理错误条件的。一些提示:

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

  • 调整您的服务器端代码,以便即使在数据库关闭时也能生成有效输出。例如,如果脚本应该生成JSON,那么即使发生错误,它也应该发送JSON数据。要做到这一点:

    • PDOException
    • 登录错误的详细信息
    • 发送JSON数据告知出现了错误,例如:

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