Ошибка, слишком много подключений к mysql с использованием PDO показали имя пользователя и пароль нашей БД?

#mysql #pdo

#mysql #pdo

Вопрос:

В какой-то момент ранее, похоже, было слишком много подключений к sql, и следующее было отправлено на экран для тех, кто искал:

 PHP Fatal error:  Uncaught exception 'PDOException' with message  'SQLSTATE[08004] [1040] Too many connections' in /dir/file.php:21
Stack trace:
#0 /dir/file.php(21): PDO->__construct('mysql:host=loca...', 'the user', 'password')
  

Как вы можете видеть, он напечатал имя пользователя и пароль.

Я новичок в PDO-форме подключения к БД, и я попал в нее, потому что люди сказали мне, что моя обычная форма mysql_connect небезопасна. Однако по умолчанию, когда mysql_connect когда-либо имел слишком много подключений, он никогда не выводил имя пользователя и пароль на экран.

Какая катастрофа.

Как мне остановить PDO от этого, если ошибка отсутствует??

Я использую:

 $dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
  

Комментарии:

1. Вы когда-нибудь выясняли это?

2. Я согласен, что это проблема, и ее следует сообщить команде PDO. Пожалуйста, проголосуйте за сокрытие учетных данных при ошибке: bugs.php.net/bug.php?id=62184

3. Хорошо — подойдет. Хотя это кажется странным, даже должна быть необходимость голосовать — просто смешно печатать учетные данные имени пользователя и пароля по умолчанию в сообщении об ошибке!! И особенно, когда, по-видимому, по крайней мере, мое понимание PDO заключается в создании более безопасного способа доступа к базе данных! Супер сбой.

Ответ №1:

PDO не делает ничего подобного.

Это происходит потому, что вы не выполняете никакой обработки исключений, поэтому вызывается обработчик ошибок PHP по умолчанию и показывает ваш стек вызовов, включая аргументы функции.

Обычно стеки вызовов — это очень хорошая вещь, поэтому вы хотите, чтобы обработчик ошибок работал; вам просто нужно правильно его использовать.

  • Поместите try / catch blocks в соответствующие места вокруг кода, который может вызывать исключения; по крайней мере, поместите catch-all try / catch block вокруг верхнего уровня вашего кода, чтобы ничего не просочилось.

Однако в документации PDO четко указано (в красном предупреждающем окне), что вы подвергаетесь большому риску, если неправильно перехватываете исключения PDO:

Если ваше приложение не улавливает исключение, вызванное конструктором PDO, по умолчанию движок zend завершает сценарий и отображает обратную трассировку. Эта обратная трассировка, скорее всего, покажет полную информацию о подключении к базе данных, включая имя пользователя и пароль. Вы несете ответственность за перехват этого исключения либо явно (с помощью оператора catch), либо неявно с помощью set_exception_handler() .

(http://www.php.net/manual/en/pdo.connections.php )

Комментарии:

1. Это имеет смысл для более умной версии меня. Теперь, если бы я мог разобраться, что такое try / catch. спасибо за указатель!!

2. @cosmicbdog: Вам определенно нужно узнать об исключениях, прежде чем использовать библиотеку, в которой они используются!

Ответ №2:

Отредактируйте свой php.ini и установите

 display_errors = 0
  

Если у вас нет доступа к php.ini, то в верхней части вашего скрипта (ов) вам нужно добавить:

 ini_set("display_errors", "0");
  

Смотрите http://php.net/manual/en/errorfunc.configuration.php и http://php.net/manual/en/function.error-reporting.php

Это остановит вывод всех ошибок в браузер. Убедитесь, что вы все еще регистрируете ошибки (через настройку php.ini).

PS Не выбрасывайте PDO

Комментарии:

1. @Tomalakgeret’kal Я полностью согласен, однако вы все равно хотите отключить вывод в браузер в качестве меры предосторожности.

2. либо сработает — следуйте соглашению в вашем файле php.ini

3. Если вы отключите ошибки, вы не увидите, что происходит… (однако спрячьте их для производства)